Quindi, ho un iterable di 3-tuple, generato pigramente. Sto cercando di capire come trasformare questo in 3 iterables, costituiti rispettivamente dal primo, dal secondo e dal terzo elemento delle tuple. Tuttavia, vorrei che questo fosse fatto pigramente.Trasporta con calma una lista in Python
Così, per esempio, vorrei [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
per essere trasformato in [1, 4, 7]
, [2, 5, 8]
, [3, 6, 9]
. (Tranne che desidero iterabili non elenchi.)
L'idioma standard zip(*data)
non funziona, poiché l'argomento decompressione espande l'intero iterabile. (È possibile verificare ciò osservando che zip(*((x, x+1, x+2) for x in itertools.count(step=3)))
si blocca.)
Il migliore che è venuta in mente finora è il seguente:
def transpose(iterable_of_three_tuples):
teed = itertools.tee(iterable_of_three_tuples, 3)
return map(lambda e: e[0], teed[0]), map(lambda e: e[1], teed[1]), map(lambda e: e[2], teed[2])
Questo sembra funzionare. Ma difficilmente sembra un codice pulito. E fa molto di quello che sembra essere un lavoro non necessario.
'izip' dal modulo' itertools'? –
Dato che si dispone di codice funzionante, è possibile ottenere risultati migliori dalla revisione del codice – wnnmaw
Come si prevede che il nuovo iteratore ottenga, ad esempio, il '7' dalla terza tupla senza consumare l'intero iterabile esterno? Il tuo 'tranpose' si bloccherà anche se lo proverai su un iteratore infinito come' count'. – BrenBarn