3 回答
TA贡献1818条经验 获得超11个赞
假设每个dict都有一个value
键,你可以写(假设你的列表被命名l
)
[d['value'] for d in l]
如果value
可能丢失,您可以使用
[d['value'] for d in l if 'value' in d]
TA贡献1784条经验 获得超8个赞
当事情变得更复杂,并且你需要开始编写带有复杂表达式的多子句或嵌套式理解时,值得研究其他选择。有几种不同的(准)标准方法可以在嵌套的dict-and-list结构上指定XPath样式的搜索,例如JSONPath,DPath和KVC。PyPI上有很好的库。
这是一个名为库的示例dpath,展示了它如何简化一些更复杂的东西:
>>> dd = {
... 'fruits': [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3}],
... 'vehicles': [{'value': 'cars', 'blah':4}]}
>>> {key: [{'value': d['value']} for d in value] for key, value in dd.items()}
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
'vehicles': [{'value': 'cars'}]}
>>> dpath.util.search(dd, '*/*/value')
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
'vehicles': [{'value': 'cars'}]}
或者,使用jsonpath-ng:
>>> [d['value'] for key, value in dd.items() for d in value]
['apple', 'banana', 'cars']
>>> [m.value for m in jsonpath_ng.parse('*.[*].value').find(dd)]
['apple', 'banana', 'cars']
乍一看这个看起来并不那么简单,因为find返回匹配对象,除了匹配的值之外还包括各种事物,例如直接指向每个项目的路径。但是对于更复杂的表达式,能够'*.[*].value'为每个表达式指定路径而不是理解子句*可以产生很大的不同。此外,JSONPath是一种与语言无关的规范,甚至还有在线测试人员可以非常方便地进行调试。
添加回答
举报