Pregunta

Estoy tratando de mostrar todas las permutaciones posibles de una lista de números, por ejemplo, si tengo 334 Quiero llegar:

3 3 4
3 4 3
4 3 3

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

Estoy seguro de que es probablemente bastante simple de usar algo como itertools.combinations pero no acabo de obtener el derecho de sintaxis.

TIA Sam

¿Fue útil?

Solución

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

Otros consejos

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']

¿Quieres permutaciones, combinaciones no. Ver: Cómo generar todas las permutaciones de una lista en 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)]

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

que haría uso de itertools de pitón, 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top