【问题标题】:More simplified explanation of chain.from_iterable and chain() of itertoolsitertools的chain.from_iterable和chain()的更简化解释
【发布时间】:2017-04-01 00:01:26
【问题描述】:

您能否对chain()chain.from_iterable 来自itertools 的这两种方法进行更简化的解释?

我已经搜索了知识库和 python 文档,但我很困惑。

我是 python 新手,所以我要求对这些进行更简化的解释。

谢谢!

【问题讨论】:

  • 你了解生成器在 python 中是如何工作的吗?如果没有,最好从那里开始。
  • 你试过写一些代码吗?它通常可以帮助我理解我读过的东西。想出一个minimal reproducible example来展示你不明白的地方。
  • 不,就像我之前所说的,我正在加紧学习 Python。我读到的关于生成器的内容是一种循环创建列表或字典的简化方法。如果我在这部分错了,您可以纠正我。

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


【解决方案1】:

您可以将序列链接成单个序列:

>>> 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 上有很多关于此的问题和答案。

【讨论】:

    【解决方案2】:

    我们可以通过查看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 工具中查看其直接实现。

    【讨论】:

      【解决方案3】:

      链将一个或多个可迭代对象作为参数除外,并返回迭代器由可迭代对象中的每个项目组成

      如下图

      import itertools
      for x in chain([1,2,3],(4,5,6)): #note can also accept different data types(list and tupe )
          print(x,end=' ')
      #output
      1 2 3 4 5 6 
      

      chain.from_iterable 接受单个可迭代作为参数

      for x in chain.from_iterable(['ABC']):  # the iterable argument with nested 
      iterable(**'ABC' is again iterable**) 
          print(x,end=' ')
      #output 
      A B C
      

      这不起作用

      for x in chain.from_iterable([1,2,3]): 
          print(x,end=' ')
          #TypeError: 'int' object is not iterable 
      

      【讨论】:

        猜你喜欢
        • 2013-02-06
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多