2012-02-22 31 views
8

Actualmente lo haría:Python combinan dos bucles for

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

¿Hay manera de hacer algo así como

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

Le gustaría acortar este tipo de bucle y esto arroja el "demasiados para descomprimir "excepción.

Respuesta

15

Use itertools.product

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

impresiones de los nueve pares:

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

ACTUALIZACIÓN: Si las dos variables x y y han de ser elegidos de una lista, puede utilizar la palabra clave repeat (según lo propuesto por agf):

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

o 'producto ([1, 2, 3], repita = 2)'. – agf

+0

@agf: ¡gracias! Siempre usé 'producto (** [1,2,3] * 2)'. Todavía podría usar mi método porque es más explícito, pero 'repeat = ...' podría ser más legible. – ninjagecko

+0

@ninjagecko Supongo que quiere decir 'producto (* [[1,2,3]] * 2)', pero no lo veo como más explícito. Como has demostrado, también es más fácil equivocarte. Auto promoción desvergonzada: vea mi respuesta altamente votada a [¿Cuál es la mejor manera de generar todas las cadenas de tres letras posibles?] (Http://stackoverflow.com/a/7074066/500584) – agf

7

Se puede usar un generador de expresión en el bucle for:

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