为啥chain.from_iterable 不遍历int 列表?

Posted

技术标签:

【中文标题】为啥chain.from_iterable 不遍历int 列表?【英文标题】:why chain.from_iterable does not iterate over int list?为什么chain.from_iterable 不遍历int 列表? 【发布时间】:2018-06-03 06:10:05 【问题描述】:

为什么chain.from_iterable 给出的参数是sus(7) 时会出错,这是一个整数列表,而不是当[sus(7)] 传递给它时它工作得很好。

import itertools as p

def sus(n):

    a = []
    for i in range(n):
        a.append(i)
    return a

print(sus(7))

for i in p.chain(sus(7)):
    print('a1',i)
for i in p.chain.from_iterable(sus(7)):
    print('a2',i)

【问题讨论】:

因为它需要一个iterable的iterable,而int的列表是int的iterable,而int是不可迭代的。查看文档中正确使用 itertools.chain.from_iterable 的示例可能会有所帮助。 非常感谢。现在我明白了。 【参考方案1】:

如果查看chain.from_iterable的来源:

def from_iterable(iterables):
# chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

您可以看到它需要一个可迭代对象,例如一个可迭代对象列表。如果你有,例如,一个字符串列表,这很好用。但是,如果您的列表元素无法迭代,并且适用于任何数值(例如 int),则会抛出您遇到的错误。

【讨论】:

那不是chain.from_iterable的源代码;这是等效功能的 Python 实现示例。 好的,但我是从docs.python.org/3/library/…的文档中得到的 @PaulaThomas github.com/python/cpython/blob/master/Modules/itertoolsmodule.c @PaulaThomas:文档说chain.from_iterable大致相当于那个 Python 函数,而不是实际的实现。

以上是关于为啥chain.from_iterable 不遍历int 列表?的主要内容,如果未能解决你的问题,请参考以下文章

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

chain.from_iterable实现同时walk多个目录

列表辗平

Python标准库(3.x): itertools库扫盲

[记录点滴] 一个Python中实现flatten的方法

如何使自定义对象可迭代?