print method iter first __iter__ python iterator
itertools.zip_longest

python - method - ¿Cómo iterar a través de dos listas en paralelo?



python itertools (7)

Deberías usar la función '' zip ''. Aquí hay un ejemplo de cómo puede verse su propia función zip

def custom_zip(seq1, seq2): it1 = iter(seq1) it2 = iter(seq2) while True: yield next(it1), next(it2)

Tengo dos iterables en Python, y quiero repasarlos en pares:

foo = (1, 2, 3) bar = (4, 5, 6) for (f, b) in some_iterator(foo, bar): print "f: ", f, "; b: ", b

Debería resultar en:

f: 1; b: 4 f: 2; b: 5 f: 3; b: 6

Una forma de hacerlo es iterar sobre los índices:

for i in xrange(len(foo)): print "f: ", foo[i], "; b: ", b[i]

Pero eso me parece un tanto antipónico. Hay una mejor manera de hacerlo?


El zip incorporado hace exactamente lo que quieres. Si desea lo mismo sobre iterables en lugar de listas, puede consultar itertools.izip, que hace lo mismo pero da resultados de uno en uno.


La función zip resuelve el problema
Documentos: zip

OBJETIVO: Poner la salida lado a lado Problema:

#value1 is a list value1 = driver.find_elements_by_class_name("review-text") #value2 is a list value2 = driver.find_elements_by_class_name("review-date") for val1 in value1: print(val1.text) print "/n" for val2 in value2: print(val2.text) print "/n"

Salida:
opinión 1
review2
review3
fecha 1
fecha2
fecha3

Solución:

for val1, val2 in zip(value1,value2): print (val1.text+'':''+val2.text) print "/n"

Salida:
review1: date1
review2: date2
review3: date3


Lo que buscas se llama zip .


Quieres la función zip .

for (f,b) in zip(foo, bar): print "f: ", f ,"; b: ", b


def ncustom_zip(seq1,seq2,max_length): length= len(seq1) if len(seq1)>len(seq2) else len(seq2) if max_length else len(seq1) if len(seq1)<len(seq2) else len(seq2) for i in range(length): x= seq1[i] if len(seq1)>i else None y= seq2[i] if len(seq2)>i else None yield x,y l=[12,2,3,9] p=[89,8,92,5,7] for i,j in ncustom_zip(l,p,True): print i,j for i,j in ncustom_zip(l,p,False): print i,j


for f, b in zip(foo, bar): print(f, b)

zip detiene cuando el más corto de foo o bar detiene.

En Python 2 , zip devuelve una lista de tuplas. Esto está bien cuando foo y bar no son masivos. Si ambos son masivos, la formación de zip(foo,bar) es una variable temporal innecesariamente masiva, y debe reemplazarse por itertools.izip o itertools.izip_longest , que devuelve un iterador en lugar de una lista.

import itertools for f,b in itertools.izip(foo,bar): print(f,b) for f,b in itertools.izip_longest(foo,bar): print(f,b)

izip detiene cuando foo o bar están agotados. izip_longest detiene cuando tanto foo como bar están agotados. Cuando se agotan los iteradores más cortos, izip_longest produce una tupla con None en la posición correspondiente a ese iterador. También puede establecer un valor de fillvalue diferente a None si lo desea. Vea aquí para la historia completa .

En Python 3 , zip devuelve un iterador de tuplas, como itertools.izip en Python2. Para obtener una lista de tuplas, use list(zip(foo, bar)) . Y para comprimir hasta que ambos iteradores estén agotados, deberías usar itertools.zip_longest .

Tenga en cuenta también que zip y sus hermanos de tipo zip pueden aceptar un número arbitrario de iterables como argumentos. Por ejemplo,

for num, cheese, color in zip([1,2,3], [''manchego'', ''stilton'', ''brie''], [''red'', ''blue'', ''green'']): print(''{} {} {}''.format(num, color, cheese))

huellas dactilares

1 red manchego 2 blue stilton 3 green brie