La mejor fuente de información es el tutorial oficial de Python sobre listas por comprensión . Las listas de comprensión son casi las mismas que las de los bucles for (ciertamente, cualquier comprensión de la lista se puede escribir como un bucle for) pero a menudo son más rápidas que usar un bucle for.
Mire esta lista de comprensión más larga del tutorial (la if
parte filtra la comprensión, solo las partes que pasan la instrucción if se pasan a la parte final de la comprensión de la lista (aquí (x,y)
):
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Es exactamente lo mismo que este bucle for anidado (y, como dice el tutorial, observe cómo el orden de for y if es el mismo).
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
La principal diferencia entre una lista de comprensión y un ciclo for es que la parte final del ciclo for (donde haces algo) viene al principio y no al final.
A tus preguntas:
¿Qué tipo debe ser el objeto para usar esto para la estructura de bucle?
Un iterable . Cualquier objeto que pueda generar un conjunto (finito) de elementos. Estos incluyen cualquier contenedor, listas, conjuntos, generadores, etc.
¿Cuál es el orden en el que i y j se asignan a los elementos del objeto?
Se asignan exactamente en el mismo orden en que se generan a partir de cada lista, como si estuvieran en un bucle for anidado (para su primera comprensión, obtendría 1 elemento para i, luego cada valor de j, segundo elemento en i, luego cada valor de j, etc.)
¿Puede ser simulado por una estructura de bucle for diferente?
Sí, ya se muestra arriba.
¿Se puede anidar este bucle for con una estructura for bucle similar o diferente? ¿Y cómo se vería?
Claro, pero no es una gran idea. Aquí, por ejemplo, le da una lista de listas de personajes:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]