entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Entendiendo como se evalúa una for loop

Hola comunidad. Estoy haciendo miniproyectos de Python (soy un principiante) y encontré uno que me interesó que es hacer un Cuadrado Latino, no tenía idea de como hacerlo así que comencé a buscar ejemplos de código y encontre uno así:

a = [1,2,3,4]
n = len(a)
[[a[i - j] for i in range(n)] for j in range(n)]

Mi problema comienza, cuando (debido a ser un principiante) no entiendo como se evalúa la for loop.

Para entenderlo mejor traté de hacer lo siguiente:

>>> [[(i,j) for i in range(3)] for j in range(3)]
[[(0, 0), (1, 0), (2, 0)], [(0, 1), (1, 1), (2, 1)], [(0, 2), (1, 2), (2, 2)]]

Esto es lo que principalmente no entiendo: (0,0), (1,0), (2,0)
¿Porqué el cero no cambia como el otro dígito?
Al parecer simplemente el primer dígito sigue con la secuencia: (0,0), (1,0), (2,0)

Y por último la pregunta que me parece más importante:
¿Cuál es la lógica que sigue la for loop para hacer esta línea de código?

[[(0, 0), (1, 0), (2, 0)], [(0, 1), (1, 1), (2, 1)], [(0, 2), (1, 2), (2, 2)]]

Gracias por leer y responder (Espero haberme explicado bien)

1 Respuesta

2votos

juan_luis_cano Puntos1520

Eso se llaman listas por comprensión (list comprehensions en inglés):

http://docs.python.org.ar/tutorial/3/datastructures.html#comprension-de-listas

Vamos a ver tres casos parecidos al tuyo:

>>> [[(i, j) for i in (0,)] for j in (0,)]  # Un elemento para i, uno para j
[[(0, 0)]]
>>> [[(i, j) for i in range(3)] for j in (0,)]  # Tres elementos para i
[[(0, 0), (1, 0), (2, 0)]]
>>> # Observa: no es lo mismo
>>> [[(i, j) for i in (0,)] for j in range(3)]  # Tres elementos para j
[[(0, 0)], [(0, 1)], [(0, 2)]]

Lo que estás pidiendo a Python es:

  1. Escoge primero un valor de la j.
  2. Evalúa la expresión interior.
    1. Escoje un valor de la i.
    2. Evalúa la expresión interior.
    3. Pasa al siguiente valor de la i, y repite hasta que terminen.
  3. Pasa al siguiente valor de la j, y repite hasta que terminen.

Por eso para cada "sublista" el segundo índice (j) se mantiene igual, y es el primero el que cambia.


Por cierto: ¡cuidado! Con esto se obtiene el resultado contrario:

>>> [(i, j) for i in range(3) for j in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

En este caso los dos for se evalúan de izquierda a derecha. Ahora no tienes una lista de sublistas como antes, pero date cuenta de que los índices varían al revés.

1voto

arturo_balbuena comentado

Muy bien explicado, por fin le entendí a esto. Muchas gracias!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta