Python ottiene tutte le permutazioni dei numeri
-
20-09-2019 - |
Domanda
Sto cercando di visualizzare tutte le possibili permutazioni di un elenco di numeri, ad esempio se ho 334 voglio ottenere:
3 3 4
3 4 3
4 3 3
Devo essere in grado di farlo per qualsiasi serie di cifre lunga fino a circa 12 cifre.
Sono sicuro che probabilmente è abbastanza semplice usare qualcosa come itertools.combinations ma non riesco a ottenere la sintassi corretta.
TIA Sam
Soluzione
>>> lst = [3, 3, 4]
>>> import itertools
>>> set(itertools.permutations(lst))
{(3, 4, 3), (3, 3, 4), (4, 3, 3)}
Altri suggerimenti
senza 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
produzione
$ ./python.py
['3', '3', '4']
['3', '4', '3']
['3', '3', '4']
['3', '4', '3']
['4', '3', '3']
['4', '3', '3']
Si vuole permutazioni, non combinazioni. Vedere: Come generare tutte le permutazioni di una lista 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)]
Si noti che è permutando la due 3 (che è la cosa giusta da fare matematicamente), ma non è lo stesso del vostro esempio. Questo farà solo una differenza se ci sono i numeri duplicati nella vostra lista.
userei itertools
di pitone, ma se si dovesse implementare da soli, ecco il codice che restituisce tutte le permutazioni di una dimensione specificata per un elenco di valori.
Esempio: 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