2010-01-12 5 views
5

मैं नंबरों की सूची के सभी संभव क्रमपरिवर्तन प्रदर्शित करने के लिए कोशिश कर रहा हूँ के सभी क्रमपरिवर्तन मिलता है, उदाहरण के लिए अगर मैं 334 है मैं प्राप्त करना चाहते हैं:अजगर संख्या

3 3 4 
3 4 3 
4 3 3 

मैं यह करने के लिए सक्षम होना चाहिए लगभग 12 अंकों तक अंकों के किसी भी सेट के लिए।

मुझे यकीन है कि यह itertools.combinations जैसे कुछ का उपयोग करके शायद काफी सरल है लेकिन मुझे सिंटैक्स सही नहीं मिल सकता है।

TIA सैम

उत्तर

24
>>> lst = [3, 3, 4] 
>>> import itertools 
>>> set(itertools.permutations(lst)) 
{(3, 4, 3), (3, 3, 4), (4, 3, 3)} 
+0

+1, एक सूची के विशिष्ट क्रमपरिवर्तन। 'सेट (सूची())' बचाव के लिए फिर से। – Seth

+0

सही thx :-) –

2

आप क्रमपरिवर्तन, नहीं संयोजन चाहते हैं। देखें: How to generate all permutations of a list in Python

>>> from itertools import permutations 
>>> [a for a in permutations([3,3,4])] 
[(3, 3, 4), (3, 4, 3), (3, 3, 4), (3, 4, 3), (4, 3, 3), (4, 3, 3)] 

ध्यान दें कि यह permuting है दो 3 (जो सही बात गणितीय करने के लिए है), लेकिन अपने उदाहरण के रूप में ही नहीं है। यदि आपकी सूची में डुप्लिकेट संख्याएं हों तो इससे केवल तभी अंतर आएगा।

3

बिना itertools

def permute(LIST): 
    length=len(LIST) 
    if length <= 1: 
     yield LIST 
    else: 
     for n in range(0,length): 
      for end in permute(LIST[:n] + LIST[n+1:]): 
       yield [ LIST[n] ] + end 

for x in permute(["3","3","4"]): 
    print x 

उत्पादन

$ ./python.py 
['3', '3', '4'] 
['3', '4', '3'] 
['3', '3', '4'] 
['3', '4', '3'] 
['4', '3', '3'] 
['4', '3', '3'] 
1

मैं अजगर के itertools का उपयोग करते हैं, लेकिन अगर आप इस अपने आप को लागू करने के लिए किया था, यहाँ कोड है कि एक निर्दिष्ट आकार के सभी क्रमपरिवर्तन देता है मूल्यों की एक सूची के लिए।

उदाहरण: values = [1,2,3], size = 2 =>[[3, 2], [2, 3], [2, 1], [3, 1], [1, 3], [1, 2]]

def permutate(values, size): 
    return map(lambda p: [values[i] for i in p], permutate_positions(len(values), size)) 

def permutate_positions(n, size): 
    if (n==1): 
    return [[n]] 

    unique = [] 
    for p in map(lambda perm: perm[:size], [ p[:i-1] + [n-1] + p[i-1:] for p in permutate_positions(n-1, size) for i in range(1, n+1) ]): 
    if p not in unique: 
     unique.append(p) 

    return unique 
+0

यह एक अच्छा जवाब है, मुझे पसंद आया, लेकिन यह अच्छा हो सकता है अगर मान शून्य का भी समर्थन करता है। पूर्व: मान = [0,1,2] यह तर्क विफल रहा है। :) – Haranadh