我知道Python中的for x in list
循环,但我偶然发现了一种我找不到文档的生成器。我发现下面的示例仅在列表a
中的列表长度为2时才有效,或者它给出了解包错误,因此我怀疑某些2元组或与字典相关的解包器可能正在运行。有人可以向我解释这个生成器语法是如何工作的吗?
$ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [[1,2],[3,4],[5,6]]
>>> (b for c, b in a)
<generator object <genexpr> at 0x1071abaa0>
>>> [x for x in (b for c, b in a)]
[2, 4, 6]
我在调用min
时使用此生成器的项目中遇到了它。最初我认为传入的是多个args,但语法没有任何意义,单独测试就发现了一个生成器。
https://github.com/bigbighd604/Python/blob/master/graph/Ford-Fulkerson.py#L59
答案 0 :(得分:4)
不要被c, b
中的逗号所欺骗。在Python中,逗号 - 而不是括号 - 是定义元组的原因。您的代码等同于[x for x in (b for (c, b) in a)]
,它会遍历a
的元素,将c
分配给a
和b
中每个双元素列表的第一个元素}到第二个,然后将b
分配给x
。如果a
的元素不是可迭代的双元素,那么您将获得ValueError
。
答案 1 :(得分:1)
从内部开始,我们从列表a:
创建一个生成器表达式a = [[1,2],[3,4],[5,6]]
所以,让我们一个人看一下:
(b for c, b in a)
因此,如果您回顾列表a
,我们会有一个列表列表,其中每个子列表只有两个项目。因此,您的生成器表达式发生的是c, b
将子列表中的每个解压缩值表示为元组。但是,如果你看一下表达式,我们只会采用b
,这就是为什么结果会最终成为:
2, 4, 6
然后向外移动,我们只是从该生成器表达式创建列表理解:
[x for x in (b for c, b in a)]
列表中的结尾:
[2, 4, 6]
实际上,如果您希望从该表达式中获取列表,您可以这样做:
list(b for c, b in a)