No es demasiado difícil simplemente escribir el pitón explícita a realizar la operación deseada:
def izip_short(a, b):
ia = iter(a)
ib = iter(b)
for x in ia:
try:
y = next(ib)
yield (x, y)
except StopIteration:
yield (x,)
break
for x in ia:
yield (x,)
for y in ib:
yield (None, y)
a = [1, 2, 3]
b = [9, 10]
list(izip_short(a, b))
list(izip_short(b, a))
yo no estaba seguro de cómo le gustaría que para manejar la secuencia b
es más larga que la secuencia a
, así que simplemente rellene un None
para el primer valor en la tupla en ese caso.
Obtenga un iterador explícito para cada secuencia. Ejecute el iterador a
como un bucle for
, mientras usa manualmente next(ib)
para obtener el siguiente valor de la secuencia b
. Si obtenemos un StopIteration
en la secuencia b
, rompemos el ciclo y luego for x in ia:
obtiene el resto de la secuencia a
; después de eso for y in ib:
no hará nada porque ese iterador ya está agotado. Alternativamente, si el primer bucle for x in ia:
agota el iterador a
, el segundo for x in ia:
no hace nada pero puede haber valores en la secuencia b
y el bucle for y in ib:
los recoge.
Use 'itertools.zip_longest' para Python 3.5 +. –