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

时间:2017-04-01 00:01:26

标签: python python-2.7 python-3.x itertools chain

您能否从chain()对这两种方法chain.from_iterableitertools进行更简单的解释?

我搜索了知识库以及python文档,但我感到困惑。

我是python的新手,这就是为什么我要求对这些进行更简化的解释。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以将序列链接到一个序列:

>>> from itertools import chain

>>> a = [1, 2, 3]
>>> b = ['a', 'b', 'c']
>>> list(chain(a, b))
[1, 2, 3, 'a', 'b', 'c']

如果ab在另一个序列中,而不是必须解压缩并将它们传递给chain,您可以将整个序列传递给from_iterable

>>> c = [a, b]
>>> list(chain.from_iterable(c))
[1, 2, 3, 'a', 'b', 'c']

它通过迭代主序列的子序列来创建序列。这有时被称为展平列表。如果要平整列表列表,则必须自己编写代码。 Stack Overflow上有很多关于这方面的问题和答案。

答案 1 :(得分:0)

通过查看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工具中的直接实施