2012-12-22 35 views
8
शामिल करने के लिए

संभव डुप्लिकेट:
Power set and Cartesian Product of a set pythonअजगर क्रमपरिवर्तन itertools कैसे आवर्ती अक्षरों

अजगर Itertools.permutations साथ

() मैं दोहरा पात्रों के साथ क्रमपरिवर्तन की प्राप्त करते हैं और उत्पादन करना चाहते हैं। उदाहरण के लिए यह मेरा कार्य नीचे और इसके वर्तमान आउटपुट के लिए।

def perm(n,i): 
    b = 0 
    while b < n: 
     n= n -1 
     from itertools import permutations as p 
     file.write('\n'.join([''.join(item) for item in p(i,n)])) 
perm(4,'0123') 

उत्पादन होता है:

012 
013 
021 
023 
031 
032 
102 
103 
120 
123 
130 
132 
201 
203 
210 
213 
230 
231 
301 
302 
310 
312 
320 
321..... 

कैसे मैं 112 या 222 की तरह एक आउटपुट प्राप्त होगा?

जो मैं संयोजनों को समझता हूं, वे आदेश विशिष्ट नहीं हैं जहां परमिट होते हैं। जो मैं खोज रहा हूं वह सभी संयोजनों को ढूंढ रहा है, फिर प्रत्येक संयोजन के लिए प्रत्येक क्रमपरिवर्तन। क्या यह संभव है?

+1

लूप में हर बार 'क्रमपरिवर्तन' आयात क्यों करें? और क्यों '' 'विस्तारित लाइन? आप इसे कम से कम साफ कर सकते हैं .. –

उत्तर

18

आप क्रमपरिवर्तन नहीं चाहते हैं। आप कार्टशियन उत्पाद चाहते हैं:

import itertools 

def perm(n, seq): 
    for p in itertools.product(seq, repeat=n): 
     file.write("".join(p)) 
     file.write("\n") 

perm(4, "0123") 
3

जो आप खोज रहे हैं वह Cartesian product है, एक क्रमपरिवर्तन नहीं है, जो itertools द्वारा भी प्रदान किया जाता है।

आप अपने आवेदन को सबसे अच्छा काम करने का निर्णय लेने के लिए क्रमपरिवर्तन, संयोजन, प्रतिस्थापन के साथ संयोजन और कार्टेशियन उत्पाद के बीच मतभेदों के साथ खुद को परिचित करने के लिए अच्छा कर सकते हैं, लेकिन संभावना है कि आप विकल्पों में से किसी एक को ढूंढ रहे हैं।

+0

मैंने सोचा कि एक सेकंड के लिए भी, लेकिन ओपी दोनों '012' और '102' दोनों चाहते हैं - या कम से कम उन्होंने अपनी सूची में इस पर टिप्पणी नहीं की - इन वह मामला शायद वह 'itertools.product' के बाद है। – DSM

+0

हां, मुझे लगता है कि आप सही हैं। मैं संपादित करूंगा। – acjay