繁体   English   中英

在二维列表理解中迭代字典列表

[英]Iterating over list of dictionaries in 2 dimensional 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]

也许这样更易读

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结果。 顺序不一样,但是您会期望的。

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

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

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

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

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

这会给你想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM