¿Hay una manera de tener paralelos para cada uno de los bucles?

Digamos que tengo 2 listas en Python y quiero recorrer cada una en paralelo; por ejemplo, hacer algo con el elemento 1 para ambas listas, hacer algo con el elemento 2 para ambas listas … Sé que puedo hacer esto usando un índice:

for listIndex in range(len(list1)): doSomething(list1[listIndex]) doSomething(list2[listIndex]) 

Pero, ¿hay una manera de hacerlo de manera más intuitiva, con un bucle foreach? Algo así como for list1Value in list1, list2Value in list2 …?

Actualmente me encuentro con esta situación en Python, pero esta es una pregunta de larga data y me gustaría saber si puedes hacerlo en cualquier idioma. (Simplemente asumí que Python es el que tiene más probabilidades de tener un método para lidiar con esto).

¿Algo como esto?

 for (a,b) in zip(list1, list2): doSomething(a) doSomething(b) 

Aunque si doSomething() no está haciendo E / S o actualizando el estado global, y solo funciona con uno de los elementos a la vez, el orden no importa, así que puedes usar chain() (de itertools):

 for x in chain(list1, list2): doSomething(x) 

A from itertools import * , from itertools import * es algo que hago muy a menudo. Considere izip() lugar de usar el zip() que le di arriba. También busque en izip_longest() , izip(count(), lst) , etc. Bienvenido a la progtwigción funcional. 🙂

Ah, y la compresión también funciona con más “columnas”:

 for idx, a, b, c in izip(count(), A, B, C): ... 

Eso dependerá del idioma. Python en realidad tiene un método bastante simple para eso:

 a = (0,1,2,3,4,5,6,7,8,9) b = "ABCDEFGHIJ" for pair in zip(a,b): print("%d => %s" % pair) 

Utilice zip o itertools.izip para esto:

 for item1, item2 in zip(iterable1, iterable2): # process the items in parallel 

itertools.izip en Python <3 y zip en Python ≥ 3 iteradores de retorno; es decir, proporcionan tuplas de pares (o trillizos, cuartetos, etc.) a petición. Python <3 zip crea una lista de tuplas, por lo que los requisitos de memoria podrían ser grandes si la secuencia más pequeña es bastante larga.