Python obtener todas las permutaciones de los números
-
20-09-2019 - |
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
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