2016-12-04 106 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

非常感謝,這項工作非常好! –