在阅读了this answer (它的代码中包含了tee )之后,我玩了一些游戏,试图概括这里给出的解决方案。
任务是懒洋洋地“转”一份清单。也就是说,列表[xrange(1, 4), xrange(4, 7), xrange(7, 10)] (在python2.7中)必须成为类似于[xrange(1, 10, 3), xrange(2, 10, 3), xrange(3, 10, 3)]的东西。
我在这里复制这里提出的解决方案:
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])我的概括是尝试做同样的事情,其中3是一个参数。因为3是输入生成器的长度,所以您无法猜测它,因此必须将它作为函数的参数添加。因为有些生成器可能是大的,甚至是无限的,所以我也认为这个参数是一个极限,所以我们只从每个输入生成器中取前n个元素。
这是我的密码:
def transpose(zipped, n):
teed = tee(zipped, n)
return [(e[i] for e in teed[i]) for i in xrange(n)]这不像预期的那样工作,如下示例所示:
>>> data = [xrange(1, 4), xrange(4, 7), xrange(7, 10)]
>>> x, y, z = transpose(data, 3)
>>> x.next()
3(我期望1)。
我想这是关于在列表中理解和泄漏名称的生成器,或者是对i或类似的东西的懒惰评估。你能告诉我的代码出了什么问题吗?如何修复?
发布于 2014-04-17 07:32:13
感谢@BrenBarn的评论,这里有一个(相当丑陋的)修补程序。不过,欢迎你提出更好的建议。
def transpose(zipped, n):
teed = tee(zipped, n)
for i in xrange(n):
gen = lambda teed, i=i: (e[i] for e in teed[i])
yield gen(teed)https://stackoverflow.com/questions/23126738
复制相似问题