2015-09-07 478 views
11

我試圖找出將兩個列表合併成所有可能組合的最佳方法。所以,如果我開始與兩個列表如下:Python將兩個列表合併爲所有可能的組合

list1 = [1, 2] 
list2 = [3, 4] 

結果列表看起來像這樣:

[[[1,3], [2,4]], [[1,4], [2,3]]] 

也就是說,它基本上會產生一個列表的列表,與之間的所有可能的組合他們倆。

我一直在通過itertools進行工作,我很確定會有答案,但我不能想出辦法讓它按照這種方式行事。我來最接近的是:

list1 = [1, 2, 3, 4] 
list2 = [5, 6, 7, 8] 
print list(itertools.product(list1, list2)) 

它生產:

[(1, 5), (1, 6), (1, 7), (1, 8), (2, 5), (2, 6), (2, 7), (2, 8), (3, 5), (3, 6), (3, 7), (3, 8), (4, 5), (4, 6), (4, 7), (4, 8)] 

所以它在各列表項的所有可能的組合,但不是所有可能產生的名單。我如何得到這個發生?

編輯:最終目標是能夠單獨處理每個列表以確定效率(我正在使用的實際數據更復雜)。因此,在上述原來的例子,它的工作是這樣的:

list1 = [1, 2] 
list2 = [3, 4] 

Get first merged list: [[1,3], [2, 4]] 
    Do stuff with this list 
Get second merged list: [[1,4], [2, 3]] 
    Do stuff with this list 

如果我得到了我上述的輸出「的名單列表的列表」,然後我可以把它變成一個for循環和進程。其他形式的輸出可以工作,但似乎最簡單的工作。

+1

'[[[1,3],[2,4]],[[1,4],[2,3]]]爲什麼列表列表?爲什麼不列出清單?什麼是標準?什麼時候進入第一或第二名單?我期望預期的結果是'[[1,3],[2,4],[1,4],[2,3]]' –

+1

這就是itertools.product給我的東西(只是一個列表的元組而不是列表的列表)。我並沒有試圖在兩個列表中找到所有可能的項目組合,而是通過合併這兩個列表來生成所有可能的列表。 我要添加另一個編輯,試圖用更簡單的英文來解釋,而不僅僅是預期的代碼輸出。 – GeoJunkie

+0

你想要兩個列表中所有可能的交織嗎?就像洗牌過程中會發生什麼一樣。所以例子'[1,2],[3,4]'會產生這樣的序列:'1 2 3 4/1 3 2 4/1 3 4 2/3 4 1 2/3 1 4 2/3 1 2 4'。 –

回答

16

repeat第一個列表,permutate第二和zip它一起

>>> from itertools import permutations, repeat 
>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> list(list(zip(r, p)) for (r, p) in zip(repeat(a), permutations(b))) 
[[(1, 4), (2, 5), (3, 6)], 
[(1, 4), (2, 6), (3, 5)], 
[(1, 5), (2, 4), (3, 6)], 
[(1, 5), (2, 6), (3, 4)], 
[(1, 6), (2, 4), (3, 5)], 
[(1, 6), (2, 5), (3, 4)]] 

編輯:正如彼得·奧滕指出,內ziprepeat是多餘的。

[list(zip(a, p)) for p in permutations(b)] 
+0

這似乎已經做到了。謝謝! – GeoJunkie

+2

如果列表的長度不同,該怎麼辦?此代碼不起作用= 0 –

+0

目前還不清楚如果列表是不對稱的,它應該做什麼。如果'b'更長,它對你有用嗎? – pacholik

3

編輯我的代碼給你你想要的輸出。

list1 = [1,2] 
list2 = [3,4] 
combined = [] 

for a in list1: 
    new_list = [] 
    for b in list2: 
     new_list.append([a, b]) 
    combined.append(new_list) 

print combined 
2

您可以創建一個列表,方法是用兩個列表成員來構造列表成員,包含列表組合。

lst1 = [1,2] 
lst2 = [3,4] 

#lst = [[j,k] for j in lst1 for k in lst2] # [[1,3],[1,4],[2,3],[2,4]] 
lst = [[[j,k] for j in lst1] for k in lst2] # [[[1,3],[2,3]],[[1,4],[2,4]]] 
print lst 
+0

Padriac是對的。這與我所尋找的不符。它符合itertools.product給我的,但不是我想要的。 – GeoJunkie

+0

我在下面修改了我的地址,我認爲它給出了你現在想要的內容 –

1

試試這個:

combos=[] 
for i in list1: 
     for j in list2: 
      combos.append([i,j]) 
print combos 
+2

格式化提示:您可以使用4個額外的前導空格縮進代碼,使其成爲像其他答案中的整齊代碼塊。 – Lynn

4

嘗試使用列表生成器來創建嵌套列表:

>>> [[[x,y] for x in list1] for y in list2] 
[[[1, 3], [2, 3]], [[1, 4], [2, 4]]] 
>>> 

或者,如果你想要一個在線列表,只是刪除括號:

>>> [[x,y] for x in list1 for y in list2] 
[[1, 3], [1, 4], [2, 3], [2, 4]] 
9

接受的答案可以被簡化爲

a = [1, 2, 3] 
b = [4, 5, 6] 
[list(zip(a, p)) for p in permutations(b)] 

(該清單()調用可以在Python 2可以省略)

-1

由於@pacholik的回答並不涵蓋不同長度的列表,這裏是我的解決方案,使用列表理解兩個變量:

first_list = [1, 2, 3] 
second_list = ['a', 'b'] 

combinations = [(a,b) for a in first_list for b in second_list] 

輸出如下像這樣:

[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')] 
+0

哪種方法最快?就像如果你有一個大的列表和大樣本集。如果說4000萬的組合哪種方法產生最快的? –

+0

涵蓋不同長度的列表,但做了完全不同的事情。這只是產生一個產品。 – pacholik

+0

你說得對,好像我在閱讀這個問題時太累了... – Minato