Transponer perezosamente una lista en Python
Entonces, tengo un iterable de 3 tuplas, generadas perezosamente. Estoy tratando de descubrir cómo convertir esto en 3 iterables, que consisten en el primer, segundo y tercer elemento de las tuplas, respectivamente. Sin embargo, deseo que esto se haga perezosamente.
Entonces, por ejemplo, deseo[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
ser convertido en[1, 4, 7]
, [2, 5, 8]
, [3, 6, 9]
. (Excepto que quiero iterables, no listas).
El estandarzip(*data)
el idioma no funciona, porque el desempaquetado de argumentos expande todo el iterable. (Puede verificar esto observando quezip(*((x, x+1, x+2) for x in itertools.count(step=3)))
se cuelga)
Lo mejor que he encontrado hasta ahora es lo siguiente:
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])
Esto parece funcionar. Pero apenas parece un código limpio. Y hace mucho de lo que parece ser un trabajo innecesario.