itertools的chain.from_iterable和chain()的更简化解释

Posted

技术标签:

【中文标题】itertools的chain.from_iterable和chain()的更简化解释【英文标题】:More simplified explanation of chain.from_iterable and chain() of itertools 【发布时间】:2017-04-01 00:01:26 【问题描述】:

您能否对chain()chain.from_iterable 来自itertools 的这两种方法进行更简化的解释?

我已经搜索了知识库和 python 文档,但我很困惑。

我是 python 新手,所以我要求对这些进行更简化的解释。

谢谢!

【问题讨论】:

你了解生成器在 python 中是如何工作的吗?如果没有,最好从那里开始。 你试过写一些代码吗?它通常可以帮助我理解我读过的东西。想出一个minimal reproducible example来展示你不明白的地方。 不,就像我之前所说的,我正在加紧学习 Python。我读到的关于生成器的内容是一种循环创建列表或字典的简化方法。如果我在这部分错了,您可以纠正我。 另见:***.com/q/15004772/610569 【参考方案1】:

您可以将序列链接成单个序列:

>>> from itertools import chain

>>> a = [1, 2, 3]
>>> b = ['a', 'b', 'c']
>>> list(chain(a, b))
[1, 2, 3, 'a', 'b', 'c']

如果ab 在另一个序列中,则不必将它们解包并将它们传递给chain,您可以将整个序列传递给from_iterable

>>> c = [a, b]
>>> list(chain.from_iterable(c))
[1, 2, 3, 'a', 'b', 'c']

它通过迭代主序列的子序列来创建一个序列。这有时称为展平列表。如果要展平列表列表,则必须自己编写代码。 Stack Overflow 上有很多关于此的问题和答案。

【讨论】:

【参考方案2】:

我们可以通过查看the docs 了解这两种工具之间的区别。

def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    ...

def from_iterable(iterable):
    # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
    ...

主要区别在于签名以及它们如何处理iterable,这是可以迭代或循环的东西。

chain 接受可迭代对象,例如 "ABC", "DEF"[1, 2, 3], [7, 8, 9]chain.from_iterable 接受一个可迭代对象,通常是嵌套的可迭代对象,例如"ABCDEF"[1, 2, 3, 7, 8, 9]。这有助于扁平化嵌套迭代。在itertools recipes 中的flatten 工具中查看其直接实现。

【讨论】:

【参考方案3】:

链将一个或多个可迭代对象作为参数除外,并返回迭代器由可迭代对象中的每个项目组成

如下图

import itertools
for x in chain([1,2,3],(4,5,6)): #note can also accept different data types(list and tupe )
    print(x,end=' ')
#output
1 2 3 4 5 6 

chain.from_iterable 接受单个可迭代作为参数

for x in chain.from_iterable(['ABC']):  # the iterable argument with nested 
iterable(**'ABC' is again iterable**) 
    print(x,end=' ')
#output 
A B C

这不起作用

for x in chain.from_iterable([1,2,3]): 
    print(x,end=' ')
    #TypeError: 'int' object is not iterable 

【讨论】:

以上是关于itertools的chain.from_iterable和chain()的更简化解释的主要内容,如果未能解决你的问题,请参考以下文章

Python的itertools模块

python itertool 浅谈迭代工具

“itertools”文件在哪里

itertools

python itertools 模块

itertools模块