青春有我
当事情变得更复杂,并且你需要开始编写带有复杂表达式的多子句或嵌套式理解时,值得研究其他选择。有几种不同的(准)标准方法可以在嵌套的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是一种与语言无关的规范,甚至还有在线测试人员可以非常方便地进行调试。