首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最后获得具有附加项的成对迭代器

最后获得具有附加项的成对迭代器
EN

Stack Overflow用户
提问于 2016-01-02 03:18:12
回答 3查看 771关注 0票数 5

目标:例如,给定的有限迭代器,p0, p1, ..., pn通过具有特殊最后项的连续项对转化为(p0, p1), (p1, p2), ..., (pn-1, pn), (pn, None)迭代器。

pairwise()函数作为itertools使用示例存在于文档中:

代码语言:javascript
运行
复制
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

但是,我还想在迭代器的末尾添加另一个项(如果是有限的),对对的第二个元素(例如None)添加一些默认值。

如何有效地实现这一附加功能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-02 03:28:14

使用itertools.zip_longest

代码语言:javascript
运行
复制
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip_longest(a, b)

当一个输入迭代器运行完时,zip_longest会用一个填充值填充它,这个值默认为None

票数 10
EN

Stack Overflow用户

发布于 2016-01-02 03:34:35

至于在末尾添加(sn, None),正如user2357112已经回答的那样,您可以只使用zip_longest,因此一个已经耗尽的迭代器不会停止整个序列(因此a迭代器仍然可以生成最后一个元素)。

对于所有其他情况,例如,如果您想在末尾添加更多元素,则只需使生成器函数本身即可。所有itertools函数都是惰性生成器,只有在请求结果中的下一个元素时才会产生新的结果,而且可以很容易地从生成器中使用这些生成器。

假设您需要pairwise在最后生成一个哨兵值(None, None),那么您可以简单地从zip_longest获得结果,然后再生成另一项:

代码语言:javascript
运行
复制
def example (iterable):
    a, b = tee(iterable)
    next(b, None)
    yield from zip_longest(a, b)
    yield (None, None)

Python3.3实际上附带了yield from语法。对于早期版本,特别是Python 2,您需要手动执行,方法是遍历项目并再次生成它们:

代码语言:javascript
运行
复制
def example (iterable):
    a, b = tee(iterable)
    next(b, None)
    for x in zip_longest(a, b):
        yield x
    yield (None, None)
票数 2
EN

Stack Overflow用户

发布于 2016-01-02 03:35:37

您可以创建一个生成器:

代码语言:javascript
运行
复制
def pairwise(iterable, additional=None):
    iterable = iter(iterable)
    first, second = next(iterable), next(iterable)
    while 1:
        yield first,second
        try:
            first,second = second, next(iterable)
        except TypeError:
            yield second, additional
            break

结果:

代码语言:javascript
运行
复制
>>> list(pairwise([1,2,3], 'a'))
[(1, 2), (2, 3), (3, 'a')]
>>> list(pairwise('abc', 'a'))
[('a', 'b'), ('b', 'c'), ('c', 'a')]
>>> list(pairwise('abcd', 'a'))
[('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'a')]

对于无限可迭代:

代码语言:javascript
运行
复制
>>> a = pairwise(infi(), 6)
>>> for i in range(10):
...     print(next(a))
...
(0, 1)
(1, 2)
(2, 3)
(3, 0)
(0, 1)
(1, 2)
(2, 3)
(3, 0)
(0, 1)
(1, 2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34562261

复制
相关文章

相似问题

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