TLW*_*TLW 11 python iterable lazy-evaluation python-3.x
所以,我有一个可重复的3元组,懒得生成.我试图找出如何将其转换为3个迭代,分别由元组的第一,第二和第三个元素组成.但是,我希望这可以懒得做.
因此,举例来说,我希望[(1, 2, 3), (4, 5, 6), (7, 8, 9)]将变成[1, 4, 7],[2, 5, 8],[3, 6, 9].(除非我想要iterables而不是列表.)
标准zip(*data)习惯用法不起作用,因为参数解包扩展了整个迭代.(您可以通过注意zip(*((x, x+1, x+2) for x in itertools.count(step=3)))挂起来验证这一点.)
到目前为止,我提出的最好的是以下内容:
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])
Run Code Online (Sandbox Code Playgroud)
这似乎有效.但它似乎不像干净的代码.而且它做了很多看似不必要的工作.
你的transpose几乎正是你所需要的。
对于您选择的任何解决方案,您都必须缓冲未使用的值(例如,要达到 7,您必须读取 1-6,并将它们存储在内存中,以备其他可迭代对象需要时使用)。tee已经做了这种缓冲,所以不需要自己实现。
唯一的其他(次要)事情是我的写法略有不同,避免使用mapand lambdas:
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] )
Run Code Online (Sandbox Code Playgroud)