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