根据索引的排列使用映射访问列表的元素

Access the element of a list with map based on permutations of the indices

我想要的是使用 map 所有排列的索引对列表访问元素,而不使用 for 循环:

起始代码:

from itertools import permutations

# string list     
n=['foo','asda','bar','words']  

# pair permutation object
index = permutations(range(0,len(n)), 2)

list(index)
Out[0]:[(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]

所以,通过使用 map 我想得到像下面代码一样的元素,在这种情况下是用 for 循环制作的:

for idx in index:
    i=n[idx[0]]
    j=n[idx[1]]
    print ((i,j))

期望的输出(如果你运行前面的例子):

('foo', 'asda')
('foo', 'bar')
('foo', 'words')
('asda', 'foo')
('asda', 'bar')
('asda', 'words')
('bar', 'foo')
('bar', 'asda')
('bar', 'words')
('words', 'foo')
('words', 'asda')
('words', 'bar)

不知道我是否理解你的需要,但这给出了与 map:

相同的输出
for i in map(lambda x: (n[x[0]], n[x[1]], total_len(n[x[0]], n[x[1]])), index):
    print i
#('foo', 'asda', 7)
#('foo', 'bar', 6)
#('foo', 'words', 8)
#('asda', 'foo', 7)
#('asda', 'bar', 7)
#('asda', 'words', 9)
#('bar', 'foo', 6)
#('bar', 'asda', 7)
#('bar', 'words', 8)
#('words', 'foo', 8)
#('words', 'asda', 9)
#('words', 'bar', 8)

要删除 total_len,您可以使用:

map(lambda x: (n[x[0]], n[x[1]]), index)

注意:如果你正在使用 python 3.x map() returns 迭代器,不像 python 2.x returns list,因此您需要将其转换为 list().

而且,如你所知,这也非常有效:

list(permutations(n, 2))

您可以简单地创建列表的排列而不是索引:

from itertools import permutations

n=['foo','asda','bar','words']  
index = list(permutations(n, 2))
print(index)

打印:

[('foo', 'asda'),
 ('foo', 'bar'),
 ('foo', 'words'),
 ('asda', 'foo'),
 ('asda', 'bar'),
 ('asda', 'words'),
 ('bar', 'foo'),
 ('bar', 'asda'),
 ('bar', 'words'),
 ('words', 'foo'),
 ('words', 'asda'),
 ('words', 'bar')]

如果你只想 "print" 它们,你可以使用 mapprint。虽然使用 map 有点丑陋,因为它有副作用,但它似乎可以做你想做的事:

from __future__ import print_function
_ = list(map(print, index))

我最接近的是:

 from itertools import permutations

 # string list     
 n=['foo','asda','bar','words']  

# pair permutation object
index = permutations(xrange(0,len(n)), 2)

  list(zip(n, n, range(4)))*3

输出:

  [('foo', 'foo', 0),
  ('asda', 'asda', 1),
  ('bar', 'bar', 2),
  ('words', 'words', 3),
  ('foo', 'foo', 0),
  ('asda', 'asda', 1),
  ('bar', 'bar', 2),
  ('words', 'words', 3),
  ('foo', 'foo', 0),
  ('asda', 'asda', 1),
  ('bar', 'bar', 2),
  ('words', 'words', 3)]