En Python, ¿hay una forma concisa de usar una lista de comprensión con múltiples iteradores?

Básicamente, me gustaría construir una lista de comprensión sobre el “producto cartesiano” de dos iteradores. Piense en el siguiente código de Haskell :

[(i,j) | i <- [1,2], j <- [1..4]] 

cuyos rendimientos

 [(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4)] 

¿Puedo obtener un comportamiento similar en Python de manera concisa?

¿Estás preguntando por esto?

 [ (i,j) for i in range(1,3) for j in range(1,5) ] 

El producto cartesiano se encuentra en el módulo de itertools (en 2.6).

 >>> import itertools >>> list(itertools.product(range(1, 3), range(1, 5))) [(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)] 

Dato curioso sobre la comprensión anidada: imita los bucles nesteds “for”, por lo que los internos pueden usar valores de los externos. Esto no es útil en el caso del producto cartesiano, pero es bueno saberlo. Por ejemplo:

 [ (i,j) for i in range(10) for j in range(i) ] 

genera todos los pares (i,j) donde 0>=i>j>10 .

Esto parece hacer lo que usted describe:

[[a, b] para a en rango (1,3) para b en rango (1,5)]

ACTUALIZACIÓN: Drat! Debería haber recargado la página para ver la respuesta de S.Lott antes de publicar. Hmmm … ¿Qué hacer para un poco de valor agregado? Quizás un breve testimonio de la utilidad del modo interactivo con Python.

Vengo más recientemente de un fondo con Perl, así que con problemas como este, me resulta muy útil escribir “python” en la línea de comandos y pasar al modo interactivo y solo a) empezar a probar cosas yb) refinar las sutilezas al golpear -trabajar y ajustar mi bash anterior hasta que consiga lo que quiero. Cada vez que estoy confuso en alguna palabra clave, la ayuda está a la mano. Simplemente escriba: help (“some_keyword”), lea el breve resumen, luego presione “Q” y estoy en línea en una conversación directa con el intérprete de python.

Recomendado si eres un principiante y no lo usas.