2011-09-11 2 views
11

में आकार के (जिसमें के तत्व शामिल हैं) के सभी सबसेट जेनरेट करें मेरे पास मानों का एक सेट है और 2 तत्वों वाले सभी सबसेट्स की सूची बनाना चाहते हैं।पायथन

उदाहरण के लिए, एक स्रोत सेट ([1,2,3]) निम्नलिखित 2-तत्व सबसेट है:

set([1,2]), set([1,3]), set([2,3]) 

वहाँ अजगर में ऐसा करने का कोई तरीका है?

उत्तर

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) के लिए iertotools.combinations (s, 2) में किया जा सकता है)]' –

1

यह {1, 2, 3} (या जो भी सेट) की power set के एक सबसेट सभी दो तत्व सेट युक्त है।

Python itertools documentation देखें और इस समस्या के सामान्य उत्तर के लिए "poweret" शब्द पर खोजें।

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 

तो मुझे लगता है कि आप हमेशा सामान्य में हो जाना चाहिए समाधान .... यदि आप अग्रिम रूप से अपने इच्छित सबसेट का आकार जानते हैं, तो इसे लूप के लिए उपयोग करने के लिए फिर से सक्षम होना चाहिए।

यह भी ध्यान रखें कि आपको list(itertools.combinations(lst, 2)) से अधिक नहीं होना चाहिए क्योंकि यह चाल सूची बनाता है (और जनरेटर का उपयोग करने से बहुत धीमी है)।

+1

ये दो परीक्षण समान नहीं करते हैं चीज़। 'itertools.combinations' वास्तव में एक tuple बनाता है; आपका घोंसला लूप एक टुपल नहीं बनाता है। – senderle

+1

मैंने एक त्वरित परीक्षण किया था। यदि आपको वास्तव में नेस्टेड लूप के अंदर टुपल्स बनाने की आवश्यकता है, तो यह 50% तक धीमा है। इसके अलावा, अगर आपको 'itertools.combinations' के आउटपुट को संसाधित करने के लिए 'for' लूप का उपयोग करने की आवश्यकता नहीं है, तो आप इस जेनरेटर अभिव्यक्ति के साथ पर्याप्त गति प्राप्त कर सकते हैं:' c3 = sum (itertools.combinations में जोड़ी के लिए 1 (एलएसटी, 2)) '। यह सबसे तेज़ घोंसला वाले लूप की तुलना में लगभग 40% तेज है। इस तरह के कोड को अनुकूलित करते समय विचार करने के लिए हमेशा कई सूक्ष्मताएं होती हैं! – senderle