itertools中的chain和chain.from_iterable有什么区别?
我在互联网上找不到任何有效的例子,我可以看到他们之间的差异,以及为什么select一个。
第一个参数是0或更多的参数,每个参数都是可迭代的,第二个参数需要一个参数,这个参数可以产生迭代次数:
itertools.chain(list1, list2, list3) iterables = [list1, list2, list3] itertools.chain.from_iterable(iterables)
但iterables
可以是任何产生迭代的迭代器。
def generate_iterables(): for i in range(10): yield range(i) itertools.chain.from_iterable(generate_iterables())
使用第二种forms通常是一个方便的例子,但是由于它懒惰地循环input迭代,所以它也是链接无限数量的有限迭代器的唯一方法:
def generate_iterables(): while True: for i in range(5, 10): yield range(i) itertools.chain.from_iterable(generate_iterables())
上面的例子会给你一个迭代,它产生一个永不停止的循环数字模式,但是永远不会消耗比单个range()
调用所需要的更多的内存。
他们做的事情非常相似。 对于less量的迭代itertools.chain(*iterables)
和itertools.chain.from_iterable(iterables)
执行类似。
from_iterables
的关键优势在于能够处理大量的(可能无限的)迭代次数,因为在调用的时候,所有这些迭代器都不需要可用。