迭代二维列表理解中的词典列表

时间:2017-01-20 00:11:20

标签: python dictionary list-comprehension

我不明白为什么这个列表理解不正确。如果我正确理解列表推导,它应首先遍历列表[dict1,dict2]中的字典,然后遍历每个字典中的键值对并返回值。我错了吗?

dict1 = {'a' : 1, 'b' : 2, 'c' : 3}
dict2 = {'c' : 2, 'd' : 3, 'e' : 4}
[value for key, value in d.items()
       for d in [dict1, dict2]]

它出现以下错误:

NameError                                 Traceback (most recent call last)
<ipython-input-78-e8d31c1fb24a> in <module>()
      1 dict1 = {'a' : 1, 'b' : 2, 'c' : 3}
      2 dict2 = {'c' : 2, 'd' : 3, 'e' : 4}
----> 3 [value for (key, value) in d.items() 
      4        for d in [dict1, dict2]]

NameError: name 'd' is not defined

我希望:

[1,2,3,2,3,4]

3 个答案:

答案 0 :(得分:1)

这可能是一种更具可读性的方式

from itertools import chain

d = [{'a' : 1, 'b' : 2, 'c' : 3}, {'c' : 2, 'd' : 3, 'e' : 4}]
chain.from_iterable(map(dict.values, d))
  

[3,1,2,2,4,3]

将每个dict仅映射到其值,并chain映射结果。订单不一样,但你期望这样。

答案 1 :(得分:0)

列表推导中嵌套for循环的顺序是相反的。在list-comprehension中,第一个for循环是首先执行的外部for循环,然后是第二个for循环。因此,如果您切换订单,它应该可以正常工作:

[value for d in [dict1, dict2] for key, value in d.items()]

# [1, 3, 2, 2, 4, 3]

答案 2 :(得分:0)

尝试在Python中使用lambda函数的优势:

map(lambda x: x[1], reduce(lambda x,y: x.items()+y.items(),  [dict1, dict2]))

这会给你想要的东西。