首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >itertools中的chain和chain.from_iterable有什么不同?

itertools中的chain和chain.from_iterable有什么不同?
EN

Stack Overflow用户
提问于 2013-02-21 22:29:14
回答 6查看 34.9K关注 0票数 79

我在互联网上找不到任何有效的例子,我可以看到它们之间的区别,以及为什么选择一个而不是另一个。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-02-21 22:30:20

第一个参数是0个或更多个参数,每个参数都是可迭代的,第二个参数是一个参数,预计会产生可迭代的变量:

代码语言:javascript
复制
from itertools import chain

chain(list1, list2, list3)

iterables = [list1, list2, list3]
chain.from_iterable(iterables)

但是iterables可以是产生迭代器的任何迭代器:

代码语言:javascript
复制
def gen_iterables():
    for i in range(10):
        yield range(i)

itertools.chain.from_iterable(gen_iterables())

使用第二种形式通常是一种方便的情况,但因为它懒惰地遍历输入迭代器,所以它也是您链接无限数量的有限迭代器的唯一方法:

代码语言:javascript
复制
def gen_iterables():
    while True:
        for i in range(5, 10):
            yield range(i)

chain.from_iterable(gen_iterables())

上面的例子将给你一个迭代器,它产生一个循环的数字模式,这个模式永远不会停止,但消耗的内存永远不会超过单个range()调用所需的内存。

票数 91
EN

Stack Overflow用户

发布于 2018-07-17 08:55:10

我找不到任何有效的例子...在这里我可以看到chainchain.from_iterable之间的区别,以及为什么选择一个而不是另一个

公认的答案是彻底的。对于那些寻求快速应用程序的人,可以考虑扁平化几个列表:

代码语言:javascript
复制
list(itertools.chain(["a", "b", "c"], ["d", "e"], ["f"]))
# ['a', 'b', 'c', 'd', 'e', 'f']

您可能希望稍后重用这些列表,因此您可以对列表进行迭代:

代码语言:javascript
复制
iterable = (["a", "b", "c"], ["d", "e"], ["f"])

尝试

但是,将一个迭代数传递给chain会得到一个未展开的结果:

代码语言:javascript
复制
list(itertools.chain(iterable))
# [['a', 'b', 'c'], ['d', 'e'], ['f']]

为什么?您传入了一个项目(一个元组)。chain需要单独列出每个列表。

解决方案

在可能的情况下,你可以解包一个可迭代的:

代码语言:javascript
复制
list(itertools.chain(*iterable))
# ['a', 'b', 'c', 'd', 'e', 'f']

list(itertools.chain(*iter(iterable)))
# ['a', 'b', 'c', 'd', 'e', 'f']

更一般地,使用.from_iterable (因为它也适用于无限迭代器):

代码语言:javascript
复制
list(itertools.chain.from_iterable(iterable))
# ['a', 'b', 'c', 'd', 'e', 'f']

g = itertools.chain.from_iterable(itertools.cycle(iterable))
next(g)
# "a"
票数 13
EN

Stack Overflow用户

发布于 2017-07-11 06:25:02

他们做的事情非常相似。对于少量的可迭代对象,itertools.chain(*iterables)itertools.chain.from_iterable(iterables)的性能相似。

from_iterables的关键优势在于能够处理大量(可能是无限的)可迭代程序,因为在调用时不需要所有可迭代程序都可用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15004772

复制
相关文章

相似问题

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