检查字典中是否存在密钥结构

2024-03-29 12:50:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望有一个函数,当给定的键列表指向字典中的现有结构时,返回True。每个键对应于字典的深度级别

我所面临的困难是,列表的长度(=键的数量)和字典的深度都是动态的

#Example Code:

keys1 = ["K1", "K3", "K4"]
keys2 = ["K2", "K6"]
keys3 = ["K1", "K6", "K4"]

dict = {
    "K1": {
        "K3": {
            "K4": "a"
        }
    },
    "K2": {
        "K6": "b"
    }
}

result = function(keys1, dict) #result should be True    
result = function(keys2, dict) #result should be True    
result = function(keys3, dict) #result should be False

Tags: true列表字典functionk2k1beresult
3条回答

简单递归方法:

def function(keys, dct):
    return not keys or (keys[0] in dct and function(keys[1:], dct[keys[0]]))

>>> function(keys1, dct)  # never shadow built-in names
True
>>> function(keys2, dct)
True
>>> function(keys3, dct)
False

这假设了一个非常统一的结构:所有中间值都是dict本身,深度总是至少是键的长度。否则,您需要处理一些错误:

def function(keys, dct):
    try:
        return not keys or function(keys[1:], dct[keys[0]])
    except (TypeError, KeyError):  # this allows you to shorten the above
        return False  

您可以定义一个遍历字典的递归函数,检查每个级别上是否存在键,如果不存在则返回False,如果键列表为空则返回True。你知道吗

def function(keys, dictionary):
    if len(keys) == 0:
        return True
    elif keys[0] in dictionary:
        return function(keys[1:], dictionary[keys[0]])
    else:
        return False

(正如schwobasegll在另一个答案中指出的,您不应该隐藏内置名称dict。)

这将遍历所有值,并检查所使用的值是否为字典:

def function(keys, dictionary):
    for value in keys1:
        if not isinstance(dictionary,dict) or value not in dictionary:
            return False
        dictionary = dictionary[value]
    return True

一点:不要将变量命名为dict,它与内置类型dict冲突

相关问题 更多 >