使用Python在嵌套字典中查找键

时间:2018-08-24 19:25:26

标签: python python-3.x dictionary

字典:

data = {
    "president": {
        "name": "Zaphod Beeblebrox",
        "species": "Betelgeusian"
    }
}

我想做的是如果存在一个名为“ name”的键,则返回。

if 'president' in data and 'name' in data['president']:
    print("found")

这很好用,但前提是我对字典的结构有一定的了解。有没有一种方法可以知道是否递归地存在一个名为“ name”的子项?我只发现了如何在顶层进行此操作。

3 个答案:

答案 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 非传统方法是使用dictjson.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: ",则此方法将无效。