首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解tee的缓冲

理解tee的缓冲
EN

Stack Overflow用户
提问于 2014-04-17 07:09:52
回答 1查看 70关注 0票数 0

在阅读了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)]的东西。

我在这里复制这里提出的解决方案:

代码语言:javascript
复制
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个元素。

这是我的密码:

代码语言:javascript
复制
def transpose(zipped, n):
    teed = tee(zipped, n)
    return [(e[i] for e in teed[i]) for i in xrange(n)]

这不像预期的那样工作,如下示例所示:

代码语言:javascript
复制
>>> data = [xrange(1, 4), xrange(4, 7), xrange(7, 10)]
>>> x, y, z = transpose(data, 3)
>>> x.next()
3

(我期望1)。

我想这是关于在列表中理解和泄漏名称的生成器,或者是对i或类似的东西的懒惰评估。你能告诉我的代码出了什么问题吗?如何修复?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-17 07:32:13

感谢@BrenBarn的评论,这里有一个(相当丑陋的)修补程序。不过,欢迎你提出更好的建议。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23126738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档