Python:这里如何使用列表理解?

Python:这里如何使用列表理解?,python,list-comprehension,Python,List Comprehension,我有以下形式的数据: foos = [{'bar': [{'baz': 1}, {'baz': 2}]}, {'bar': [{'baz': 3}, {'baz': 4}]}, {'bar': [{'baz': 5}, {'baz': 6}]}] 我想要一份能够产生以下结果的列表: [1, 2, 3, 4, 5, 6] 我不太清楚该怎么做。这类工作: >>> [[bar['baz'] for bar in foo['bar']] for foo in foos] [[1,

我有以下形式的数据:

foos = [{'bar': [{'baz': 1}, {'baz': 2}]}, {'bar': [{'baz': 3}, {'baz': 4}]}, {'bar': [{'baz': 5}, {'baz': 6}]}]
我想要一份能够产生以下结果的列表:

[1, 2, 3, 4, 5, 6]
我不太清楚该怎么做。这类工作:

>>> [[bar['baz'] for bar in foo['bar']] for foo in foos]
[[1, 2], [3, 4], [5, 6]]

但是我希望结果是一个扁平的列表。

您可以使用两个
来完成,而不是嵌套列表理解。。在一个列表中的
子句中:

In [19]: [item['baz'] for foo in foos for item in foo['bar']]
Out[19]: [1, 2, 3, 4, 5, 6]
注意

[... for foo in foos for item in foo['bar']]
大致翻译成

for foo in foos:
    for item in foo['bar']:
        ...
这就行了

 [y['baz'] for x in foos for y in x['bar']]
如果你认为这不是很自然,我同意


除非有其他原因,否则显式代码可能会更好。

我觉得这个示例很难阅读。翻译后的版本非常直白,但是压缩后很难说清楚是怎么回事。@chmullig:我同意multiple
for。。在
中,子句有点令人难以置信。但是,当有人解释如何粗略地翻译它们时,我脑海中的一个灯泡熄灭了(或者点亮了?),正如我试图在上面展示的那样。我希望它能像帮助我一样帮助别人。FWIW,我觉得这种理解很容易理解@当一个人第一次研究综合列表时,这是同样的问题。经过练习,它最终进入大脑。6502的解决方案和unutbu的解决方案是相同的,但前者有3分,后者有8分,现在我写!要使列表更平坦:sum([[1,2],[3,4],[5,6]],[]),sum()有两个参数:“这并不是很自然”。为什么?还有什么?@eyquem:例如,我会发现将两个
替换为
s更自然,但无论如何,一旦理解变得不那么简单,我认为它就失去了目标(在python中,可读代码是语法中的优先顺序)。我认为这对最初的海报来说也不是微不足道的,因为在这种情况下,他不会在这里问……交换它们是很有诱惑力的,因为“x['bar']中的y”中的y出现在y['baz']的后面和附近似乎更自然。但是x上的迭代必须在y上的迭代之前,因为interpeter从左到右读取指令,他必须在y之前遇到x,才能知道在“对于x['bar']”中遇到x时该怎么办@eyquem:我认为这是不自然的,因为在第一个表达式(被插值的表达式)中,你可以看到所有变量,然后在第二个循环中,你看不到任何变量(它是“外循环”),然后在第三个循环中(内循环),你看到一个变量,依此类推。计算每个表达式中可见变量的数量,得到N,0,1,…,N-1。我认为它更合理,N,N-1,N-2,…,0。对于单变量列表理解的常见情况,当然没有区别。换句话说,它就像一个“嵌套的for”序列,但首先要编写最里面的表达式。
foos = [{'bar': [{'baz': 1}, {'baz': 2}]}, {'bar': [{'baz': 3}, {'baz': 4}]}, {'bar': [{'baz': 5}, {'baz': 6}]}]

for x in foos:
  for y in x:

    for i in range(len(x[y])):
      for z in x[y][i]:
        print x[y][i][z]