当前位置: 首页 > 面试题库 >

优雅的方法来检查字典中是否存在嵌套键?

郑博
2023-03-14
问题内容

是否有更可读的方法来检查是否存在嵌入字典的键而无需独立检查每个级别?

可以说我需要在埋藏的对象中获取此值(示例取自Wikidata):

x = s['mainsnak']['datavalue']['value']['numeric-id']

为了确保不会以运行时错误结束,有必要检查每个级别,如下所示:

if 'mainsnak' in s and 'datavalue' in s['mainsnak'] and 'value' in s['mainsnak']['datavalue'] and 'nurmeric-id' in s['mainsnak']['datavalue']['value']:
    x = s['mainsnak']['datavalue']['value']['numeric-id']

我可以想到的另一种解决方法是将其包装到一个try catch结构中,对于这样一个简单的任务,我也觉得很尴尬。

我正在寻找类似的东西:

x = exists(s['mainsnak']['datavalue']['value']['numeric-id'])

True如果所有级别都存在,则返回。


问题答案:

简而言之,使用Python,您必须相信请求宽恕比允许许可容易

try:
    x = s['mainsnak']['datavalue']['value']['numeric-id']
except KeyError:
    pass

答案

这是我处理嵌套dict键的方法:

def keys_exists(element, *keys):
    '''
    Check if *keys (nested) exists in `element` (dict).
    '''
    if not isinstance(element, dict):
        raise AttributeError('keys_exists() expects dict as first argument.')
    if len(keys) == 0:
        raise AttributeError('keys_exists() expects at least two arguments, one given.')

    _element = element
    for key in keys:
        try:
            _element = _element[key]
        except KeyError:
            return False
    return True

例:

data = {
    "spam": {
        "egg": {
            "bacon": "Well..",
            "sausages": "Spam egg sausages and spam",
            "spam": "does not have much spam in it"
        }
    }
}

print 'spam (exists): {}'.format(keys_exists(data, "spam"))
print 'spam > bacon (do not exists): {}'.format(keys_exists(data, "spam", "bacon"))
print 'spam > egg (exists): {}'.format(keys_exists(data, "spam", "egg"))
print 'spam > egg > bacon (exists): {}'.format(keys_exists(data, "spam", "egg", "bacon"))

输出:

spam (exists): True
spam > bacon (do not exists): False
spam > egg (exists): True
spam > egg > bacon (exists): True

它以给element定的顺序循环测试给定的每个键。

variable.get('key', {})我发现的所有方法相比,我都更喜欢此方法,因为它遵循EAFP。

功能除外,例如:keys_exists(dict_element_to_test, 'key_level_0', 'key_level_1', 'key_level_n', ..)。至少需要两个参数,元素和一个键,但是您可以添加所需的键数。

如果您需要使用某种地图,则可以执行以下操作:

expected_keys = ['spam', 'egg', 'bacon']
keys_exists(data, *expected_keys)


 类似资料:
  • 假设我有以下两本词典: 我想检查dict1是否是dict2的子集(即dict 1中的键值对是否显示在dict2中,而dict2中的相同键值将包括额外的值,如充电状态和设备)。 但我知道 请注意,这是一个不同的问题: 遍历所有嵌套字典值? 对嵌套字典的嵌套值求和 循环访问嵌套字典 有人能帮忙吗? 提前致谢。

  • 我陷入了需要检查嵌套JSON对象中是否存在键的情况。通过嵌套JSON对象,我在父JSON对象中有一个JSON对象作为其键之一的值。所以我需要检查这个键是否存在于整个JSON对象中。我将以下数据作为对象获取。我知道我可以解析这个对象以获取JSON对象。 我使用了方法来检查主JSON对象中是否存在密钥,它可以正常工作。但是要检查任何内部JSON对象,比如“info”,我需要再次将解析为JSON对象,然

  • 问题内容: 比方说,我有一个关联数组,像这样:。 如何检查字典中是否存在? 问题答案: if key in array: # do something 关联数组在Python中称为字典,您可以在stdtypes文档中了解有关它们的更多信息。

  • 问题内容: 我陷入一种情况,我需要检查嵌套JSON对象中是否存在密钥。通过嵌套的JSON对象,我在父JSON对象中具有一个JSON对象作为其键之一的值。所以我需要检查此密钥是否存在于整个JSON对象中。我将以下数据作为对象。我知道我可以解析此对象以获得JSON对象。 我已经使用方法来检查主要JSON对象中密钥的存在,并且它可以工作。但是对于检查任何内部JSON对象(例如“ info”),我需要再次

  • rank ▲ ✰ vote url 47 435 86 477 url 检查一个键在字典中是否存在 在更新字典之前想检查键是否存在.我写了如下代码: if 'key1' in dict.keys(): print "blah" else: print "boo" 我想这不是最好的方法,还有什么更好的方法? 用in. d = dict() for i in xrange(100):

  • 问题内容: 我想在更新密钥值之前测试字典中是否存在密钥。我写了以下代码: 我认为这不是完成此任务的最佳方法。有没有更好的方法来测试字典中的键? 问题答案: 是测试密钥是否存在的预期方法。 如果你想使用默认值,可以随时使用dict.get(): 如果你想始终确保任何键的默认值,则可以重复使用,也可以从模块中使用它,如下所示: 但总的来说,关键字是最好的方法。