我在互联网上找不到任何有效的例子,我可以看到它们之间的区别,以及为什么选择一个而不是另一个。
发布于 2013-02-21 22:30:20
第一个参数是0个或更多个参数,每个参数都是可迭代的,第二个参数是一个参数,预计会产生可迭代的变量:
from itertools import chain
chain(list1, list2, list3)
iterables = [list1, list2, list3]
chain.from_iterable(iterables)但是iterables可以是产生迭代器的任何迭代器:
def gen_iterables():
for i in range(10):
yield range(i)
itertools.chain.from_iterable(gen_iterables())使用第二种形式通常是一种方便的情况,但因为它懒惰地遍历输入迭代器,所以它也是您链接无限数量的有限迭代器的唯一方法:
def gen_iterables():
while True:
for i in range(5, 10):
yield range(i)
chain.from_iterable(gen_iterables())上面的例子将给你一个迭代器,它产生一个循环的数字模式,这个模式永远不会停止,但消耗的内存永远不会超过单个range()调用所需的内存。
发布于 2018-07-17 08:55:10
我找不到任何有效的例子...在这里我可以看到
chain和chain.from_iterable之间的区别,以及为什么选择一个而不是另一个
公认的答案是彻底的。对于那些寻求快速应用程序的人,可以考虑扁平化几个列表:
list(itertools.chain(["a", "b", "c"], ["d", "e"], ["f"]))
# ['a', 'b', 'c', 'd', 'e', 'f']您可能希望稍后重用这些列表,因此您可以对列表进行迭代:
iterable = (["a", "b", "c"], ["d", "e"], ["f"])尝试
但是,将一个迭代数传递给chain会得到一个未展开的结果:
list(itertools.chain(iterable))
# [['a', 'b', 'c'], ['d', 'e'], ['f']]为什么?您传入了一个项目(一个元组)。chain需要单独列出每个列表。
解决方案
在可能的情况下,你可以解包一个可迭代的:
list(itertools.chain(*iterable))
# ['a', 'b', 'c', 'd', 'e', 'f']
list(itertools.chain(*iter(iterable)))
# ['a', 'b', 'c', 'd', 'e', 'f']更一般地,使用.from_iterable (因为它也适用于无限迭代器):
list(itertools.chain.from_iterable(iterable))
# ['a', 'b', 'c', 'd', 'e', 'f']
g = itertools.chain.from_iterable(itertools.cycle(iterable))
next(g)
# "a"发布于 2017-07-11 06:25:02
他们做的事情非常相似。对于少量的可迭代对象,itertools.chain(*iterables)和itertools.chain.from_iterable(iterables)的性能相似。
from_iterables的关键优势在于能够处理大量(可能是无限的)可迭代程序,因为在调用时不需要所有可迭代程序都可用。
https://stackoverflow.com/questions/15004772
复制相似问题