for f, b in zip(foo, bar):
print(f, b)
zip
se detiene cuando el más corto de foo
o bar
paradas.
En Python 2, zip
devuelve una lista de tuplas. Esto está bien cuando foo
y bar
no son masivos. Si ambos son masivos entonces formando zip(foo,bar)
es una variable temporal innecesariamente masiva , y debe ser reemplazada 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
paradas cuando se agota cualquiera foo
o bar
. izip_longest
se detiene cuando se agotan foo
y bar
. Cuando los iteradores más cortos están agotados, izip_longest
produce una tupla con None
en la posición correspondiente a ese iterador. También puede configurar un fillvalue
diferente además de None
si lo desea. Vea aquí para el full story.
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 , usaría itertools.zip_longest.
Nótese también que zip
y sus zip
-como brethen puede 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))
impresiones
1 red manchego
2 blue stilton
3 green brie
@unutbu En Python 3, el nombre de la función es 'itertools.zip_longest', en lugar de' itertools.izip_longest' (básicamente 'zip ...' en lugar de 'izip ...' en el módulo 'itertools'). Es una edición de un solo personaje; de lo contrario, editaría la corrección súper menor en tu respuesta yo mismo. –
@MichaelA: Gracias por la corrección. – unutbu
@unutbu ¿Por qué preferiría el método de OP sobre el de 'izip' (aunque el' izip'/'zip' se vea mucho más limpio)? – armundle