为啥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()的更简化解释