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']
如果a
和b
在另一个序列中,则不必将它们解包并将它们传递给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()的更简化解释的主要内容,如果未能解决你的问题,请参考以下文章