2013-03-09 10 views
7

Jestem nowy w Pythonie i staram się stworzyć kombinację wielu list. Tak więc mam trzy (i możliwe więcej) wyglądające tak:wybierz kombinacje z wielu list

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

ze wszystkimi listami o tej samej długości. Teraz chciałbym wygenerować ich listę kombinacji, przy czym N jest całkowitą liczbą powyższych list. Szukam wyniku patrząc jak:

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

taki sposób, że każda kombinacja, powiedzmy (1,10,22) jest tej samej długości co wielu oryginalnych list (w tym przypadku 3)

+0

itertools i podobne artykuły: http://docs.python.org/2/library/itertools.html?highlight= itertools # itertools.product – squiguy

Odpowiedz

12

przeczytać ten http://docs.python.org/2/library/itertools.html#itertools.product, to wszystko wyjaśnia.

itertools to pakiet zawierający szereg przydatnych funkcji do iterowania po kolekcjach. Jedną z przydatnych funkcji jest funkcja product, która tworzy generator, który będzie iterować nad iloczynem kartezjańskim dowolnej liczby zbiorów iteracyjnych, które mu dasz.

Wynik itertools.product nie jest listą, jest to generator. Generator python jest podobny do coroutine w innych językach. Oznacza to, że oblicza kombinacje w zależności od potrzeb. Jeśli obliczysz iloczyn trzech iteracji, z których każdy ma rozmiar 100, ale użyjesz tylko pierwszych 10, itertools.product oblicza tylko 10 kombinacji zamiast obliczać wszystkie kombinacje 100^3.

Jeśli rzeczywiście chcesz obiekt listy zamiast generatora (może chcesz obliczyć plasterki lub coś podobnego), wywołaj funkcję list i przekazuj obiekt generatora jako argument.

Poniższy kod generuje wszystkie kombinacje i drukuje wyniki.

Kod:

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 

Wyjścia:

(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: dziękuję za to za tonę. bardzo czyste. akceptując twoją odpowiedź. – AJW

2

Myślę, że to jest to, czego szukasz:

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

to daje obiekt iteratora, który może lub nie może być to, co chcesz. Aby przekształcić go do normalnej listy, wystarczy użyć tego:

comb = list(comb) 
Powiązane problemy