2010-01-12 23 views
5

que estoy tratando de mostrar todas las permutaciones posibles de una lista de números, por ejemplo, si tengo 334 Quiero llegar:Python obtener todas las permutaciones de los números

3 3 4 
3 4 3 
4 3 3 

tengo que ser capaz de hacer esto para cualquier conjunto de dígitos de hasta 12 dígitos de longitud.

Estoy seguro de que es bastante simple usar algo así como itertools.combinations pero no puedo entender bien la sintaxis.

TIA Sam

Respuesta

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

+1, distintas permutaciones de una lista. 'set (list())' al rescate de nuevo. – Seth

+0

perfecto thx :-) –

2

Usted quiere permutaciones, combinaciones no. Ver: 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)] 

Nota que está permutando los dos de 3 (que es lo correcto matemáticamente para hacerlo), pero no es lo mismo que tu ejemplo. Esto solo hará la diferencia si hay números duplicados en su lista.

3

sin 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 

salida

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

que haría uso de pitón de itertools, pero si tuviera que aplicar esto por sí mismo, aquí está el código que devuelve todas las permutaciones de un tamaño especificado para una lista de valores.

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

Esta es una respuesta genial, me gustó, pero podría ser buena si los valores también son compatibles con cero. Ej .: valores = [0,1,2] esta lógica está fallando. :) – Haranadh

Cuestiones relacionadas