2012-02-22 20 views
8

Attualmente mi farei:Python combinare due cicli for

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

C'è modo di fare qualcosa di simile

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

Vorrei ridurre questo tipo di ciclo e questo getta il "troppi per decomprimere "l'eccezione.

risposta

15

Utilizzare itertools.product

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

stampe tutte le nove coppie:

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

UPDATE: Se le due variabili x e y devono essere scelti da un elenco, è possibile utilizzare la parola chiave repeat (come proposto da agf):

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

o 'prodotto ([1, 2, 3], ripetere = 2)'. – agf

+0

@agf: grazie! Ho sempre usato il prodotto (** [1,2,3] * 2) '. Potrei ancora usare il mio metodo perché è più esplicito, ma 'repeat = ...' potrebbe essere più leggibile. – ninjagecko

+0

@ninjagecko Suppongo tu voglia dire 'prodotto (* [[1,2,3]] * 2)', ma non lo vedo come più esplicito. Come hai dimostrato, è anche più facile sbagliare. Autopromozione senza vergogna: vedi la mia risposta in alta considerazione a [Qual è il modo migliore per generare tutte le stringhe di tre lettere?] (Http://stackoverflow.com/a/7074066/500584) – agf

7

Si potrebbe utilizzare un generatore di espressione nel ciclo for:

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