我不明白为什么这个列表理解不正确。如果我正确理解列表推导,它应首先遍历列表[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]
答案 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]))
这会给你想要的东西。