2011-09-11 184 views

回答

22

好像你要itertools.combinations

>>> list(itertools.combinations((1, 2, 3), 2)) 
[(1, 2), (1, 3), (2, 3)] 

如果你想套你必須給他們明確的轉化。

>>> s = set((1, 2, 3)) 
>>> map(set, itertools.combinations(s, 2)) 
[set([1, 2]), set([1, 3]), set([2, 3])] 
+0

該死的!,順便說一下你的地圖可以用列表comp '[set(i)for i in itertools.combinations(s,2))]' –

1

只給另一個角度看,我找了一個方法來遍歷的{1.....N}尺寸2的所有子集,所以我把itertools.combinations到測試:

import itertools 
from time import time 


N = 7000 
lst = [i for i in xrange(N)] 

st = time() 
c1 = 0 
for x in itertools.combinations(lst, 2): 
    c1 += 1 
print "combinations: %f" % (time()-st) 

st = time() 
c2=0 
for x in xrange(N): 
    for y in xrange(x): 
     c2 += 1 
print "double loop: %f" % (time()-st) 
print "c1=%d,c2=%d" % (c1,c2) 

# prints: 
#combinations: 4.247000 
#double loop: 3.479000 
# c1=24496500,c2=24496500 

所以我想你不應該總是變成一般解決方案....如果您事先知道所需子集的大小,則使用for循環進行迭代應該更有效。

另請注意,由於此操作會創建列表(並且比使用生成器本身慢得多),因此您不應該重複執行list(itertools.combinations(lst, 2))

+1

這兩個測試不會做同樣的事情事情。 'itertools.combinations'實際上創建了一個元組;你的嵌套循環不會創建一個元組。 – senderle

+1

我做了一個快速測試。如果實際上需要在嵌套循環內創建元組,它會減慢50%。此外,如果您不需要使用'for'循環來處理'itertools.combinations'的輸出,則可以使用此生成器表達式獲得實質性的加速:'c3 = sum(1 for itertools.combinations( 1,2))'。它的運行速度比最快的嵌套循環快40%。優化這種代碼時總會考慮很多細節! – senderle

相關問題