hacer for ejercicios doble contador ciclos ciclo bucles bucle aplicaciones anidados anidado python loops for-loop nested nested-loops

python - for - Una sola línea anidada para bucles



for de 2 en 2 en python (3)

Escribió esta función en python que transpone una matriz:

def transpose(m): height = len(m) width = len(m[0]) return [ [ m[i][j] for i in range(0, height) ] for j in range(0, width) ]

En el proceso me di cuenta de que no entiendo completamente cómo se ejecutan las anulaciones de una sola línea para los bucles. Por favor, ayúdame a comprender respondiendo las siguientes preguntas:

  1. ¿Cuál es el orden en que se ejecuta este ciclo for?
  2. Si tuviera un ciclo triple anidado para, ¿qué orden se ejecutaría?
  3. ¿Qué sería igual al ciclo sin unida igual para?

Dado,

[ function(i,j) for i,j in object ]

  1. ¿Qué tipo debe ser el objeto para usar esto para la estructura de bucle?
  2. ¿Cuál es el orden en que i y j están asignados a los elementos en el objeto?
  3. ¿Se puede simular mediante una estructura de bucle diferente?
  4. ¿Se puede anidar esto para bucle con una estructura similar o diferente para bucle? ¿Y cómo se vería?

También se aprecia información adicional.


En primer lugar, su primer código no utiliza un bucle for per per se, sino una comprensión de la lista .

  1. Sería equivalente a

    para j en rango (0, ancho): para i en rango (0, alto): m [i] [j]

  2. De la misma manera, generalmente anida como para bucles, de derecha a izquierda. Pero listar la sintaxis de comprensión es más complejo.

  3. No estoy seguro de lo que esta pregunta está haciendo

  1. Cualquier objeto iterable que produzca objetos iterables que produzcan exactamente dos objetos (lo que un bocado - es decir [(1,2),''ab''] sería válido)

  2. El orden en que el objeto cede en la iteración. i al primer rendimiento, j el segundo.

  3. Sí, pero no tan bonito. Yo creo que es funcionalmente equivalente a:

    l = list() for i,j in object: l.append(function(i,j))

    o incluso mejor use el map :

    map(function, object)

    Pero, por supuesto, la función tendría que obtener i , j sí misma.

  4. ¿No es esta la misma pregunta que 3?


Es posible que le interese el producto itertools.product , que devuelve un conjunto iterativo de tuplas de valores de todos los elementos por los que lo pasa. Es decir, itertools.product(A, B) produce todos los valores de la forma (a, b) , donde los valores a provienen de A y los valores b provienen de B Por ejemplo:

import itertools A = [50, 60, 70] B = [0.1, 0.2, 0.3, 0.4] print [a + b for a, b in itertools.product(A, B)]

Esto imprime:

[50.1, 50.2, 50.3, 50.4, 60.1, 60.2, 60.3, 60.4, 70.1, 70.2, 70.3, 70.4]

Observe cómo el argumento final pasó a itertools.product es el "interno". En general, itertools.product(a 0 , a 1 , ... a n ) es igual a [(i 0 , i 1 , ... i n ) for i n in a n for i n-1 in a n-1 ... for i 0 in a 0 ]


La mejor fuente de información es el tutorial oficial de Python sobre comprensión de listas . Las comprensiones de listas son casi las mismas que para los bucles (ciertamente, cualquier comprensión de lista se puede escribir como un bucle for) pero a menudo son más rápidos que el uso de un bucle for.

Mire esta lista más larga de comprensión del tutorial (la parte if filtra la comprensión, solo las partes que pasan la sentencia if pasan a la parte final de la lista de comprensión (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 ciclo 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 en lugar de al final.

En 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 que i y j están asignados a los elementos en el objeto?

Se asignan exactamente en el mismo orden en que se generan de cada lista, como si estuvieran en un bucle anidado (para su primera comprensión obtendría 1 elemento para i, luego cada valor de j, 2 ° elemento en i, entonces cada valor de j, etc.)

¿Se puede simular mediante una estructura de bucle diferente?

Sí, ya se muestra arriba.

¿Se puede anidar esto para bucle con una estructura similar o diferente para bucle? ¿Y cómo se vería?

Claro, pero no es una gran idea. Aquí, por ejemplo, le da una lista de listas de caracteres:

[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]