Ecco una ripartizione di come usare `iTertools.permutations" in modo efficiente, insieme al perché `np.random.permutation` non è adatto per generare tutte le permutazioni:
1. Utilizzando `iTertools.permutations` (l'approccio consigliato)
`` `Python
Importa iTtools
def all_permutations (input_list):
"" "
Genera tutte le possibili permutazioni di un elenco.
Args:
Input_list:l'elenco per cui generare permutazioni.
Ritorni:
Un generatore che produce tuple, in cui ogni tupla è una permutazione.
"" "
return iTertools.permutations (input_list)
my_list =[1, 2, 3]
permutazioni =all_permutations (my_list)
per perm in permutazioni:
Stampa (perm) # stampa ogni permutazione come tupla.
my_list =[1, 2, 3]
permutazioni =all_permutations (my_list)
per perm in permutazioni:
Stampa (elenco (perm)) # stampa ogni permutazione come elenco
my_list =[1, 2, 3]
permutazioni =elenco (all_permutations (my_list)) # Converti il generatore in un elenco
list_of_lists =[elenco (perm) per perm in permutazioni] # converti tuple in elenco
Stampa (list_of_lists)
`` `
Spiegazione:
* `iTertools.permutations (input_list)`: Questo è il nucleo della soluzione. Restituisce un * iteratore * (in particolare, un oggetto "Permutazioni"). Un iteratore è efficiente dalla memoria perché genera permutazioni su richiesta, una alla volta, invece di crearle tutte in una volta in memoria. Questo è cruciale per elenchi più lunghi in cui il numero di permutazioni può diventare estremamente grande (n! Cresce molto rapidamente).
* Generatore: L'uso di un generatore (l'iteratore) è importante per l'efficienza. Se si convertisce il generatore in un elenco in anticipo (ad es. Elenco (iTertools.permutations (input_list)) `), genererai immediatamente * tutte * permutazioni, che possono portare a problemi di memoria per elenchi di input più grandi. Elaborare le permutazioni una per una usando un loop `per '.
* `tuple` output: `iTertools.permutations` restituisce ogni permutazione come` tuple`. Se hai bisogno dell'output come `elenco`, è possibile convertire la tupla usando` elenco (perm) `.
* Efficienza: `iTertools.permutations` è implementato in C ed è altamente ottimizzato per questo compito. È il modo più efficiente per generare permutazioni in Python.
2. Perché `np.random.permutation` non è idoneo
`np.random.permutation` è progettato per generare * permutazioni casuali *, non tutte. Ecco perché non funzionerà correttamente allo scopo previsto:
* Casualità: Genera una singola permutazione casuale ogni volta che la chiami.
* Nessuna garanzia di tutte le permutazioni: Per ottenere * tutte * permutazioni con `np.random.permutation`, dovresti chiamarlo ripetutamente finché non hai visto tutto N! possibilità. Non c'è modo di sapere quando hai esaurito tutte le permutazioni senza tenere traccia di quelle che hai già visto, il che diventa estremamente complesso e inefficiente. Non vi è alcuna garanzia che tu genererai mai ogni possibile permutazione in questo modo.
* ripetizione inefficiente: Genereresti molte permutazioni duplicate prima (forse mai mai) vedendole tutte.
tentativo errato (e inefficiente) usando `np.random.permutation` (solo scopi illustrativi - non usare):
`` `Python
Importa Numpy come NP
def tentativo_all_permutations_with_numpy (input_list):
"" "
Non usarlo! È un tentativo errato e inefficiente
Per generare tutte le permutazioni usando np.random.permutation.
"" "
Visualizza_permutazioni =set ()
all_perms =[]
n =len (input_list)
factorication_n =np.math.factoriale (n) # Questo potrebbe traboccare!
mentre len (shew_permutations)
Se perman non in sew_permutations:
seve_permutations.add (perm)
all_perms.append (elenco (perm))
restituisce all_perms
my_list =[1, 2, 3]
`` `
Problemi con il tentativo numpy:
* Problemi di memoria: Il set `Visuazioni_permutazioni" crescerebbe rapidamente a una dimensione enorme, potenzialmente superando la memoria disponibile, in particolare per elenchi leggermente più grandi.
* Efficienza: La condizione di loop `len (seve_permutations)
* Conversione Tuple: La conversione di array numpy in tuple e torna alle liste è un sovraccarico che "ITertools" evita.
In sintesi:
Per generare tutte le possibili permutazioni di un elenco in Python, usa sempre `iTertools.permutations` . È il modo corretto, più efficiente e pitonico per risolvere questo problema. Evitare l'utilizzo di `np.random.permutation` per questo scopo, in quanto è progettato per un compito diverso e porterà a un codice errato e inefficiente.
Non usare questo esempio! È solo per dimostrazione del perché è errata.
permutazioni =tentativo_all_permutations_with_numpy (my_list) # potenzialmente impicca o usa memoria eccessiva.
stampa (permutazioni)
Informazioni correlate
Programmazione © www.354353.com