![](/img/trans.png)
[英]How can I check if a value exists in a dictionary that is nested within a loop
[英]How to know if a value exists in a list within a nested dictionary
我如何检查字典中是否存在“安娜”? 挑战似乎正在访问列表中的值:
data = {"Pam": {"Job":"Pilot",
"YOB": "1986",
"Children": ["Greg", "Anna","Sima"]},
"Joe": {"Job":"Engineer",
"YOB": "1987"}}
如果您的词典如上所述,并且您只想测试“ Anna”是否在“ Pam”子词典的“ Children”列表中,则只需执行以下操作:
print("Anna" in data["Pam"]["Children"])
但我认为您实际上想要更一般的东西。 ;)
这是一个递归函数,它将检查由嵌套字典和列表组成的对象,寻找给定值。 外部对象可以是字典或列表,因此适合处理从JSON创建的对象。 请注意,它会忽略dict键,而只会查看值。 它会根据需要进行深度递归以找到匹配值,但是一旦找到匹配项,它将立即停止搜索。
def has_value(obj, val):
if isinstance(obj, dict):
values = obj.values()
elif isinstance(obj, list):
values = obj
if val in values:
return True
for v in values:
if isinstance(v, (dict, list)) and has_value(v, val):
return True
return False
# Test
data = {
"Pam": {
"Job": "Pilot",
"YOB": "1986",
"Children": ["Greg", "Anna", "Sima"]
},
"Joe": {
"Job": "Engineer",
"YOB": "1987"
}
}
vals = ("Pam", "Pilot", "1986", "1987", "1988", "YOB", "Greg",
"Anna", "Sima", "Engineer", "Doctor")
for v in vals:
print(v, has_value(data, v))
输出
Pam False
Pilot True
1986 True
1987 True
1988 False
YOB False
Greg True
Anna True
Sima True
Engineer True
Doctor False
您传递给has_value
的obj
必须是字典或列表,否则将失败
UnboundLocalError: local variable 'values' referenced before assignment
您可以将any
与列表推导一起使用,以检查'Anna'
是否作为字典中的键存在或作为子词典中的元素出现:
data = {"Pam": {"Job":"Pilot",
"YOB": "1986",
"Children": ["Greg", "Anna","Sima"]},
"Joe": {"Job":"Engineer",
"YOB": "1987"}}
if any(a == 'Anna' or 'Anna' in b.get('children', []) for a, b in data.items()):
pass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.