Non è troppo difficile basta scrivere Python esplicito di fare l'operazione desiderata:
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))
non ero sicuro di come si vorrebbe gestire la sequenza b
è più lunga della sequenza a
, quindi inserisco semplicemente un None
per il primo valore nella tupla in quel caso.
Ottieni un iteratore esplicito per ciascuna sequenza. Eseguire l'iteratore a
come ciclo for
, mentre manualmente utilizzando next(ib)
per ottenere il valore successivo dalla sequenza b
. Se otteniamo un StopIteration
nella sequenza b
, interrompiamo il ciclo e quindi for x in ia:
ottiene il resto della sequenza a
; dopo di che for y in ib:
non farà nulla perché l'iteratore è già esaurito. In alternativa, se il primo ciclo for x in ia:
esaurisce l'iteratore a
, il secondo for x in ia:
non fa altro che valori nella sequenza b
e il ciclo for y in ib:
li raccoglie.
Usa 'itertools.zip_longest' per Python 3.5+. –