Python 检查字典中是否存在密钥结构
我希望有一个函数,当给定的键列表指向字典中的现有结构时,该函数返回True。每个键对应于字典的深度级别 我所面临的困难是,列表的长度(=键的数量)和字典的深度都是动态的Python 检查字典中是否存在密钥结构,python,dictionary,Python,Dictionary,我希望有一个函数,当给定的键列表指向字典中的现有结构时,该函数返回True。每个键对应于字典的深度级别 我所面临的困难是,列表的长度(=键的数量)和字典的深度都是动态的 #Example Code: keys1 = ["K1", "K3", "K4"] keys2 = ["K2", "K6"] keys3 = ["K1", "K6", "K4"] dict = { "K1": { "K3": { "K4": "a" }
#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
您可以定义一个遍历字典的递归函数,检查每个级别上是否存在键,如果不存在则返回False,如果键列表变为空则返回True
def函数(键、字典):
如果len(键)==0:
返回真值
字典中的elif键[0]:
返回函数(键[1]、字典[0])
其他:
返回错误
(正如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冲突。简单递归方法:
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
到目前为止,您尝试了什么?您需要编写一个递归函数,检查每个键是否在previsou键内,并在此函数中传递键和新字典