gpt4 book ai didi

python - 使用 python 列表理解过滤 json 响应

转载 作者:行者123 更新时间:2023-11-28 21:18:30 24 4
gpt4 key购买 nike

给定一个带有许多键(属性?)的 json 对象,例如:

[{'name': 'Bob', 'infos': {'spam': 'eggs', 'foo': 'bar'}},
{'name': 'Tom'},
{'name': 'Lisa', 'infos': {'spam': 'qux', 'foo': 'baz'}}
...]

我希望使用列表理解来过滤掉 entry['infos']['spam'] == 'eggs'

的条目

如果可能的话,我更喜欢列表推导式,但到目前为止,我唯一的解决方案是使用多个 .get(),其中树下最远的那些最右边(以避免KeyError 通过在它到达那里之前使声明 False 而发生。

例如,

# Will obviously fail with KeyError
[each for each in my_json if each['infos']['spam'] == 'eggs']

# Works but requires a separate / additional `.get()`, and only works
# because it is returning False before it evaluates all conditions
[each for each in my_json if each.get('infos') and each.get('infos').get('spam') == 'eggs']

# Fails as all conditions will be evaluated before running
[each for each in my_json if all([each.get('infos'), each.get('infos').get('spam') == 'eggs'])]

# Not a list comprehension, but concise... and also doesn't work
filter(lambda x: x['infos']['spam'] == 'eggs', my_json)

有没有更好的方法来过滤我的 json 响应?我问的原因是一些 API 返回 json 对象,其中包含感兴趣的键 deep ...并且必须使用类似 each.get('a') 和 each['a '].get('b') 和 each['a']['b'].get('c') == 'd' 似乎只是为了验证 each['a ']['b']['c'] == 'd'

我想我总是可以使用try except KeyError

mylist = []
for each in my_json:
try:
if each['infos']['spam'] == 'eggs':
mylist.append(each)
except KeyError:
pass

是否有一个明显的解决方案(最好在 python3 标准库中)可以消除所有可用解决方案中的冗余?

最佳答案

如果该键不存在任何项目,您可以指定默认为 get,这样您就可以使用

[each for each in my_json if each.get('infos', {}).get('spam') == 'eggs']

第一个 get get('infos', {}) 指定一个空字典作为默认值,这样第二个 get 就不会失败。

这里是一个过滤器

>>> filter(lambda x: x.get('infos', {}).get('spam') == 'eggs', my_json)
[{'infos': {'foo': 'bar', 'spam': 'eggs'}, 'name': 'Bob'}]

请注意,如果“infos”存在于外部字典中,但它本身不是字典,这些仍然会中断。

一个更健壮的方法是定义一个过滤器函数:

>>> def wonderful_spam(x):
... try:
... return x['infos']['spam'] == 'eggs'
... except (KeyError, TypeError):
... return False
...
>>> filter(wonderful_spam, my_json)
[{'infos': {'foo': 'bar', 'spam': 'eggs'}, 'name': 'Bob'}]
>>> [x for x in my_json if wonderful_spam(x)]
[{'infos': {'foo': 'bar', 'spam': 'eggs'}, 'name': 'Bob'}]

关于python - 使用 python 列表理解过滤 json 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26456881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com