2013-03-09 13 views
7

Sono nuovo in Python e sto lottando per formare una combinazione di più elenchi. Quindi, ne ho tre (e possibile di più) in questo modo:combinazioni di pick da più elenchi

uk_rock_stars=[1,2,3,4,5,6,7,8,9] 
uk_pop_stars=[10,11,12,13,1,4,6,22,81] 
us_stars=[22,34,44,7,33,99,22,77,99] 
. 
. 

con tutte le liste della stessa lunghezza. Ora vorrei creare un elenco di combinazioni di esse, dove N è il numero totale di elenchi sopra. Sto cercando un risultato che sembra:

comb=[(1,10,22),(1,10,34),(1,10,44)...etc (all combinations)....] 

tale che, ogni combinazioni, dicono (1,10,22) è di stessa lunghezza del numero di liste originali (in questo caso 3)

+0

itertools e simili: http://docs.python.org/2/library/itertools.html?highlight= itertools # itertools.product – squiguy

risposta

12

Leggi su questo http://docs.python.org/2/library/itertools.html#itertools.product, si spiega tutto.

itertools è un pacchetto che ha un sacco di funzionalità utili per iterare su raccolte. Una funzione utile è la funzione product che crea un generatore che itererà sul prodotto cartesiano di un numero qualsiasi di raccolte iterabili che gli si assegnano.

Il risultato di itertools.product non è un elenco, è un generatore. Un generatore python è simile a una coroutine in altre lingue. Ciò significa che calcolerà le tue combinazioni in base alle necessità. Se calcoli il prodotto di tre iterabili ciascuno con dimensione 100, ma utilizzi solo i primi 10 o così, lo itertools.product calcolerà solo 10 combinazioni invece di calcolare tutte le combinazioni 100^3.

Se si desidera effettivamente un oggetto elenco invece di un generatore (forse si desidera calcolare fette o qualcosa) chiamare la funzione list e passare l'oggetto generatore come argomento.

Il codice seguente produce tutte le combinazioni e stampa i risultati.

Codice:

import itertools 

uk_rock_stars=[1,2,3,4,5,6,7,8,9] 
uk_pop_stars=[10,11,12,13,1,4,6,22,81] 
us_stars=[22,34,44,7,33,99,22,77,99] 

for combination in itertools.product(uk_rock_stars, uk_pop_stars, us_stars): 
    print combination 

Uscite:

(1, 10, 22) 
(1, 10, 34) 
(1, 10, 44) 
(1, 10, 7) 
(1, 10, 33) 
(1, 10, 99) 
(1, 10, 22) 
(1, 10, 77) 
(1, 10, 99) 
(1, 11, 22) 
(1, 11, 34) 
(1, 11, 44) 
(1, 11, 7) 
(1, 11, 33) 
(1, 11, 99) 
(1, 11, 22) 
(1, 11, 77) 
(1, 11, 99) 
... 
etc. 
+0

martega: grazie mille per questo. molto chiaro. accettando la tua risposta. – AJW

2

credo che questo è ciò che stai cercando:

import itertools 
comb = itertools.product(uk_rock_stars, uk_pop_stars, us_stars) 

vi darà un oggetto iteratore, che può o non può essere quello che vuoi. Per convertirlo in un elenco normale, basta usare questo:

comb = list(comb) 
Problemi correlati