2010-01-12 4 views
5

Je suis en train d'afficher toutes les permutations possibles d'une liste de numéros, par exemple, si je 334 je veux faire:Python obtenir toutes les permutations de nombres

3 3 4 
3 4 3 
4 3 3 

Je dois être en mesure de le faire pour n'importe quel ensemble de chiffres d'environ 12 chiffres.

Je suis sûr que c'est probablement assez simple en utilisant quelque chose comme itertools.combinations mais je ne peux pas vraiment obtenir la syntaxe correcte.

TIA Sam

Répondre

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

+1, permutations distinctes d'une liste. 'set (list())' à la rescousse à nouveau. – Seth

+0

thx parfait :-) –

2

Vous voulez permutations, combinaisons non. Voir: 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)] 

Notez qu'il est permutant les deux 3 années (ce qui est la bonne chose à faire mathématiquement), mais pas le même que votre exemple. Cela ne fera une différence que s'il y a des numéros dupliqués dans votre liste.

3

sans 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 

sortie

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

J'utilise itertools de python, mais si vous deviez mettre en œuvre vous-même, le code est ici qui renvoie toutes les permutations d'une taille spécifiée pour une liste de valeurs.

Exemple: 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

Ceci est une réponse cool, j'ai aimé, mais il pourrait être bon si les valeurs prend également en charge zéro. Ex: values ​​= [0,1,2] cette logique échoue. :) – Haranadh