2011-03-11 74 views
1

說我有一個列表,我想在不考慮順序的情況下生成所有獨特元素對的列表。要做到這一點的方法之一是:複製迭代器和生成無序自笛卡爾積

mylist = ['W','X','Y','Z'] 
for i in xrange(len(mylist)): 
    for j in xrange(i+1,len(mylist)): 
     print mylist[i],mylist[j] 
W X 
W Y 
W Z 
X Y 
X Z 
Y Z 

我想用迭代器來做到這一點,我認爲以下的,即使它不具有簡潔:

import copy 
it1 = iter(mylist) 
for a in it1: 
    it2 = copy.copy(it1) 
    for b in it2: 
     print a,b 

但這並不甚至工作。使用迭代器或zip等來做這件事情的更加pythonic和有效的方式是什麼?

+0

這是我今天已經看到了這個問題的功課第二次。 – Apalala 2011-03-11 01:54:10

+0

@Apalala,感謝downvote,但我確實希望得到我正在編碼的東西的答案,並且在搜索時我找不到其他類似的問題。 – highBandWidth 2011-03-11 02:04:03

回答

6

這已經完成,並已包含在標準庫像Python 2.6的:

import itertools 

mylist = ['W', 'X', 'Y', 'Z'] 
for pair in itertools.combinations(mylist, 2): 
    print pair  # pair is a tuple of 2 elements 

似乎很符合Python我;-)

請注意,即使你計算了不少的combinations()函數返回一個迭代器,以便您可以立即開始打印它們。請參閱docs。此外,您所指的結果是列表與其自身之間的笛卡爾乘積,但這不是嚴格正確的:笛卡爾乘積有16個單元(4x4)。您的輸出是其中的一個子集,即只有列表值的2元素combinations(不允許重複)。

+1

你說得對,我應該把它稱爲組合,這可能會讓我得到答案! – highBandWidth 2011-03-11 02:05:49

0

@卡梅隆的回答是正確的。

我只是想指出,

for i in range(len(mylist)): 
    do_something_to(mylist[i]) 

是nastily聯合國Python化;如果你的操作是隻讀的(不必存儲回數組),做

for i in mylist: 
    do_something_to(i) 

否則

mylist = [do_something_to(i) for i in mylist] 
+0

我同意,但我在做範圍(len(mylist)),因爲我需要引用索引。 – highBandWidth 2011-03-11 02:02:18

+0

你也可以使用枚舉。例如: 「for index,枚舉值(mylist):print(index,value)」 – utdemir 2011-03-11 10:57:24