title python
En Python, ¿hay una forma concisa de usar una lista de comprensión con múltiples iteradores? (4)
Básicamente, me gustaría construir una lista de comprensión sobre el "producto cartesiano" de dos iteradores. Piensa en el siguiente código 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 forma concisa?
¿Estás preguntando sobre esto?
[ (i,j) for i in range(1,3) for j in range(1,5) ]
Dato curioso sobre la comprensión anidada: imita los bucles "for" anidados, 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
.
El producto cartesiano está en el módulo 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)]
Esto parece hacer lo que describes:
[[a, b] para a dentro del rango (1,3) para b en el rango (1,5)]
ACTUALIZACIÓN: ¡Drat! Debería haber recargado la página para ver la respuesta de S.Lott antes de publicarla. Hmmm ... ¿qué hacer para agregar un poco de valor? Quizás un breve testimonio de la utilidad del modo interactivo con Python.
Vengo recientemente de 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 a) comenzar a probar cosas, yb) refinar las sutilezas al golpear arriba -arrow y ajustar mi intento anterior hasta que obtenga lo que quiero. Cada vez que estoy confuso con alguna palabra clave, la ayuda está a la mano. Simplemente escriba: help ("some_keyword"), lea el breve resumen, luego presione "Q" y vuelvo a estar en línea en una conversación directa con el intérprete de Python.
Recomendado si eres un principiante y no lo usas.