2012-02-22 14 views
8

Obecnie chciałbym zrobić:Python połączyć dwie pętle

for x in [1,2,3]: 
    for y in [1,2,3] 
     print x,y 

Czy istnieje sposób zrobić coś jak

for x,y in ([1,2,3],[1,2,3]): 
    print x,y 

Chcesz skrócić ten rodzaj pętli, a to rzuca „zbyt wiele rozpakuj "wyjątek.

Odpowiedz

15

Stosować itertools.product

import itertools 
for x, y in itertools.product([1,2,3], [1,2,3]): 
    print x, y 

drukuje wszystkie dziewięć par:

1 1 
1 2 
1 3 
2 1 
2 2 
2 3 
3 1 
3 2 
3 3 

UPDATE: jeśli dwie zmienne x i y powinny być dobrane z jednej listy, można użyć słowa kluczowego repeat (zgodnie z propozycją agf):

import itertools 
for x, y in itertools.product([1,2,3], repeat=2): 
    print x, y 
+6

lub 'produktu ([1, 2, 3] powtórzenie = 2) '. – agf

+0

@agf: thanks! Zawsze używałem 'produktu (** [1,2,3] * 2)'. Mogę nadal używać mojej metody, ponieważ jest bardziej wyraźna, ale "repeat = ..." może być bardziej czytelna. – ninjagecko

+0

@ninjagecko Zakładam, że masz na myśli 'produkt (* [[1,2,3]] * 2)', ale nie widzę tego jako bardziej jednoznacznego. Jak już pokazałeś, łatwiej też popełnić błąd. Bezwstydna autopromocja: Zobacz moją wysoce przeczącą odpowiedź na [Jaki jest najlepszy sposób generowania wszystkich możliwych ciągów trzyliterowych?] (Http://stackoverflow.com/a/7074066/500584) – agf

7

można użyć do ekspresji generatora w pętli:

for x, y in ((a,b) for a in [1,2,3] for b in [5,6,7]): 
    print x, y 
Powiązane problemy