Your transpose
is pretty much exactly what you need.
With any solution you'd choose, you'd have to buffer the unused values (e.g. to get to the 7, you have to read 1-6, and store them in memory for when the other iterables ask for them). tee
already does exactly that kind of buffering, so there's no need implementing it yourself.
The only other (minor) thing is that I'd write it slightly differently, avoiding the map
and lambda
s:
def transpose(iterable_of_three_tuples):
teed = itertools.tee(iterable_of_three_tuples, 3)
return ( e[0] for e in teed[0] ), ( e[1] for e in teed[1] ), ( e[2] for e in teed[2] )