2011-11-13 7 views
18

यह एक स्ट्रिंग वापस करने के बजाय, प्रत्येक क्रमपरिवर्तन के लिए अक्षर या अंकों की एक सूची क्यों देता है?पायथन Itertools.Permutations()

उदाहरण के लिए:

>>> print([x for x in itertools.permutations('1234')]) 
>>> [('1', '2', '3', '4'), ('1', '2', '4', '3'), ('1', '3', '2', '4') ... ] 

ऐसा क्यों है यह वापस नहीं करता है?

>>> ['1234', '1243', '1324' ... ] 

उत्तर

35

itertools.permutations() बस इस तरह से काम करता है। यह एक तर्क के रूप में एक मनमाना पुनरावृत्ति लेता है, और हमेशा एक इटेटरेटर ट्यूबल उपज देता है। यह विशेष-मामले तारों (और नहीं होना चाहिए) नहीं करता है। स्ट्रिंग की एक सूची प्राप्त करने के लिए, आप हमेशा अपने आप को tuples शामिल हो सकते हैं:

list(map("".join, itertools.permutations('1234'))) 
+4

सूची COMP, gen-expr, या अन्य विधि नहीं होने पर आप इस पर मानचित्र का उपयोग क्यों कर रहे हैं। –

+0

मुझे लगता है कि 'नक्शा ("" शामिल हों, itertools.permutations (' 1234 ')) 'पर्याप्त है। सूची जोड़ना() कोई फर्क नहीं पड़ता है। –

+0

@ बिलकेंग पायथन 2 में, 'मानचित्र()' का परिणाम पहले से ही एक सूची है, यह सच है, लेकिन यह सवाल पायथन 3 के बारे में था। ज्यादातर मामलों में, आपको 'मानचित्र द्वारा लौटाए गए जेनरेटर ऑब्जेक्ट के साथ करने में सक्षम होना चाहिए() 'पायथन 3 में, लेकिन आसान परीक्षण के लिए मैंने एक सूची में स्पष्ट रूपांतरण जोड़ा। –

3

मैंने कोशिश नहीं की है, लेकिन सबसे अधिक संभावना काम करना चाहिए

comb = itertools.permutations("1234",4) 
for x in comb: 
    ''.join(x)  
1

Perumatation तार और सूची के लिए किया जा सकता है भी, नीचे है उदाहरण ..

x = [1,2,3] 

अगर आपको उपर्युक्त सूची

print(list(itertools.permutations(x, 2))) 

# the above code will give the below.. 
# [(1,2),(1,3),(2,1)(2,3),(3,1),(3,2)] 
पर क्रमपरिवर्तन करने की आवश्यकता है