2016-12-04 100 views
0

我经历了将两个列表与itertools结合的一些问题,但找不到解决我的问题的问题。那么,是否有可能在Python中使用itertools(或任何其他模块)执行以下操作? 我有两个列表:python中两个列表的组合

list1 = ['Elizabeth', 'Anne', 'Wells', 'Cannon'] 
list2 = ['E.', 'A.', 'W.', 'C.'] 

现在,我正在寻找一个解决方案,将它们组合起来,如结果如下所示(例如,作为列表的列表):

['Elizabeth', 'Anne', 'Wells', 'Cannon'] 
['E.', 'Anne', 'Wells', 'Cannon'] 
['Elizabeth', 'A.', 'Wells', 'Cannon'] 
['Elizabeth', 'Anne', 'W.', 'Cannon'] 
['Elizabeth', 'Anne', 'Wells', 'C.'] 
['E.', 'A.', 'Wells', 'Cannon'] 
['E.', 'Anne', 'W.', 'Cannon'] 
... 
['E.', 'A.', 'W.', 'C.'] 
+1

到目前为止,您尝试过哪些方法,显示了一些您尝试解决问题的代码? – aBiologist

回答

0

产生指数越来越长的组合,然后利用那些用缩写来代替名字:

from itertools import combinations 

def replacements(names, initials): 
    for count in range(len(names)): 
     for positions in combinations(range(len(names)), count): 
      yield [initials[i] if i in positions else name for i, name in enumerate(names)] 
    yield initials 

所以上面的第一个不替代anyt (length = 0),然后替换一个元素(length = 1,输出[0],然后[1]等),一直到3替换([0, 1, 2],[0, 1, 3]等)。最后,我们输出initials,作为“4替换”的情况。

演示:

>>> names = ['Elizabeth', 'Anne', 'Wells', 'Cannon'] 
>>> initials = ['E.', 'A.', 'W.', 'C.'] 
>>> for result in replacements(names, initials): 
...  print(result) 
... 
['Elizabeth', 'Anne', 'Wells', 'Cannon'] 
['E.', 'Anne', 'Wells', 'Cannon'] 
['Elizabeth', 'A.', 'Wells', 'Cannon'] 
['Elizabeth', 'Anne', 'W.', 'Cannon'] 
['Elizabeth', 'Anne', 'Wells', 'C.'] 
['E.', 'A.', 'Wells', 'Cannon'] 
['E.', 'Anne', 'W.', 'Cannon'] 
['E.', 'Anne', 'Wells', 'C.'] 
['Elizabeth', 'A.', 'W.', 'Cannon'] 
['Elizabeth', 'A.', 'Wells', 'C.'] 
['Elizabeth', 'Anne', 'W.', 'C.'] 
['E.', 'A.', 'W.', 'Cannon'] 
['E.', 'A.', 'Wells', 'C.'] 
['E.', 'Anne', 'W.', 'C.'] 
['Elizabeth', 'A.', 'W.', 'C.'] 
['E.', 'A.', 'W.', 'C.'] 

当然,而是采用了专用initials列表,你可以只使用每次name[0] + '.'刚刚生成初始。

+0

非常感谢,这项工作非常好! –