字典:
data = {
"president": {
"name": "Zaphod Beeblebrox",
"species": "Betelgeusian"
}
}
我想做的是如果存在一个名为“ name”的键,则返回。
if 'president' in data and 'name' in data['president']:
print("found")
这很好用,但前提是我对字典的结构有一定的了解。有没有一种方法可以知道是否递归地存在一个名为“ name”的子项?我只发现了如何在顶层进行此操作。
答案 0 :(得分:2)
您可以进行递归搜索:
data = {
"president": {
"name": "Zaphod Beeblebrox",
"species": "Betelgeusian"
}
}
def r_find(target, key):
if key in target:
return True
else:
for k, v in target.items():
if isinstance(v, dict):
if r_find(v, key):
return True
return False
print(r_find(data, "name"))
print(r_find(data, "species"))
print(r_find(data, "no-name"))
输出
True
True
False
答案 1 :(得分:1)
您可以使用try
/ except
定义递归生成器:
def recursive_keys(d):
for k, v in d.items():
try:
yield from recursive_keys(v)
except AttributeError:
yield k
'name' in set(recursive_keys(data)) # True
如果愿意,可以改用isinstance
:
def recursive_keys(d):
for k, v in d.items():
if isinstance(v, dict):
yield from recursive_keys(v)
else:
yield k
这是相对昂贵的,因为在检查set
中是否存在某项之前,首先要创建所有密钥的set
。根据@pault的评论,您可以使用:
any(x == 'name' for x in recursive_keys(data))
有关没有生成器的惰性解决方案,请参见@DanielMesejo's solution。这可以提高效率,因为它避免了昂贵的__next__
通话。
答案 2 :(得分:0)
一种 hacky 非传统方法是使用dict
将json.dumps
转换为字符串。然后,您可以像在字符串中一样搜索密钥。
例如:
import json
def find_key(d, key):
if not isinstance(d, dict):
return False
else:
return '"'+key+'": ' in json.dumps(d)
print(find_key(data, 'name'))
#True
一个限制是,如果您可以在一个值中包含"name: "
,则此方法将无效。