在Python中懒洋洋地转置列表

在Python中懒洋洋地转置列表,python,python-3.x,lazy-evaluation,iterable,Python,Python 3.x,Lazy Evaluation,Iterable,所以,我有一个三元组的iterable,是惰性生成的。我试图找出如何将其转换为3个可数元组,分别由元组的第一、第二和第三个元素组成。然而,我希望这件事能懒散地进行 例如,我希望[(1,2,3)、(4,5,6)、(7,8,9)]变成[1,4,7],[2,5,8],[3,6,9]。(除了我想要的是易趣列表,而不是列表。) 标准的zip(*data)习惯用法不起作用,因为参数unpacking会扩展整个iterable。(您可以通过注意zip(*(x,x+1,x+2)for x in itertool

所以,我有一个三元组的iterable,是惰性生成的。我试图找出如何将其转换为3个可数元组,分别由元组的第一、第二和第三个元素组成。然而,我希望这件事能懒散地进行

例如,我希望
[(1,2,3)、(4,5,6)、(7,8,9)]
变成
[1,4,7]
[2,5,8]
[3,6,9]
。(除了我想要的是易趣列表,而不是列表。)

标准的
zip(*data)
习惯用法不起作用,因为参数unpacking会扩展整个iterable。(您可以通过注意
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])

这似乎奏效了。但这似乎不像是干净的代码。而且它做了很多看起来不必要的工作。

你的
转置几乎就是你需要的

对于您选择的任何解决方案,您都必须缓冲未使用的值(例如,要获得7,您必须读取1-6,并将它们存储在内存中,以便其他iterables请求它们时使用)
tee
已经完全实现了这种缓冲,所以不需要自己实现

唯一的另一件(次要的)事情是,我会写它稍微不同,避免
map
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] )

来自
itertools
模块的
izip
?既然您有工作代码,您可能会从代码审阅中获得更好的结果。您希望新迭代器从第三个元组中获得
7
,而不消耗整个外部iterable吗?如果您在无限迭代器(如
count
)上尝试,您的
tranpose
也将挂起。如果您提供一个如何使用它的示例,这将有所帮助。也许我们可以提出一个更好的方案approach@wnnmaw不,这样贴就可以了。他/她要求的是一种方法,而不是我们审查和编辑他/她的代码。