2011-12-04 120 views
4

我有一個列表的龐大的羣體,我想結合列表中的:它看起來有點像這樣:如何在Python中組合兩個列表中的每個元素?

[[1,2,3,4,5], [6,7,8,9,0], [2,5,7,9,4], [4,7,8,43,6]...] 

達到這些名單的約20在列表中。我現在想第一個列表,第二個列表相結合,看起來像這樣:

[[1,6], [2,7], [3,8], [4,9], [5,0]] 

然後,我要與第一和第三,所有的方式,直到最後再做一遍。然後再次從第二個列表開始到第3,第4 ...最後一行(但不是第1個,因爲這已經在第1到第2列表中完成了)。我怎樣才能編寫這樣做的代碼?

這是我到目前爲止有:

xcols =列的所有列表像我展示上面

def MakeLists(xcols): 
    multilist = [] 
    for i in xcols: 
     for j in xcols[index(i):]: 
      currentlist = map(list.__add__, i, j) 
      multilist.append(currentlist) 

給我一個錯誤,當我運行它,雖然,可能是在地圖的一部分因爲我不知道如何首先將每個元素轉換爲列表然後映射它們。任何幫助都會很棒。謝謝!

回答

4

怎麼是這樣的:

>>> import itertools 
>>> foo = [[1, 2, 3], [4, 5, 6], [7, 8, 8]] 
>>> for p in itertools.permutations(foo, 2): 
...  print zip(*p) 
... 
[(1, 4), (2, 5), (3, 6)] 
[(1, 7), (2, 8), (3, 8)] 
[(4, 1), (5, 2), (6, 3)] 
[(4, 7), (5, 8), (6, 8)] 
[(7, 1), (8, 2), (8, 3)] 
[(7, 4), (8, 5), (8, 6)] 

編輯: 如果你只是想壓縮與後一個列表,如人的意見正在解釋:

>>> import itertools 
>>> for p in itertools.combinations(foo, 2): 
...  print zip(*p) 
... 
[(1, 4), (2, 5), (3, 6)] 
[(1, 7), (2, 8), (3, 8)] 
[(4, 7), (5, 8), (6, 8)] 
+0

這將是一個非常好的解決方案,但這不會以OP想要它工作的方式工作 - 它用第一個等壓縮第二個列表(但它應該僅在第二個列表後面用「zip」等等。)。 – Tadeck

+0

我認爲OP必須要求組合,而不是排列:「(但不是第一個,因爲這已經完成了第1至第2列表)」 –

+0

謝謝,夥計們。我想我沒有正確理解或者沒有引起足夠的重視。我已經更新了我的答案。 – stranac

2
a=[[1,2,3,4,5],[6,7,8,9,0],[2,5,7,9,4],[4,7,8,43,6]] 

i=0 

for l in a[i:]: 
    for inner in a[i+1:]: 
     print [list(b) for b in zip(l, inner)] 
    i += 1 

打印

[[1, 6], [2, 7], [3, 8], [4, 9], [5, 0]] 
[[1, 2], [2, 5], [3, 7], [4, 9], [5, 4]] 
[[1, 4], [2, 7], [3, 8], [4, 43], [5, 6]] 
[[6, 2], [7, 5], [8, 7], [9, 9], [0, 4]] 
[[6, 4], [7, 7], [8, 8], [9, 43], [0, 6]] 
[[2, 4], [5, 7], [7, 8], [9, 43], [4, 6]] 
+0

通常,您不希望在Python中使用c樣式循環。有時是必要的,但它是不刺激的。 –

1
def foo(li): 
    for element in li[1:]: 
    for pair in zip(li[0], element): 
     yield pair 

>>> from test import foo 
>>> bar = [[1, 2, 3, 5, 6], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] 
>>> foo(bar) 
<generator object foo at 0x10592df50> 
>>> [e for e in foo(bar)] 
[(1, 6), (2, 7), (3, 8), (5, 9), (6, 10), (1, 11), (2, 12), (3, 13), (5, 14), (6, 15)] 
1

你只能如果您有偶數個列表來完成你想要的結果。這段代碼將產生預期的結果。但是,可能會有更多的「pythonic」。

foo = [[1,2,3,4,5],[6,7,8,9,0],[2,5,7,9,4],[4,7,8,43,6]] 
newlist = [] 

for i in xrange(len(foo)): 
    if i % 2 == 0: 
     list1 = foo[i] 
     list2 = foo[i + 1] 
     for n in xrange(len(list1)): 
      newlist.append([list1[n],list2[n]]) 

print newlist 

結果:

[[1, 6], [2, 7], [3, 8], [4, 9], [5, 0], [2, 4], [5, 7], [7, 8], [9, 43], [4, 6]] 
1

最短的解決方案(lsts是你有一個列表的列表):

[zip(lsts[i],lsts[j]) for i in xrange(len(lsts)) for j in xrange(i,len(lsts)) if i!=j] 

這會對你說什麼。嘗試一下。

是你期望的嗎?

相關問題