检查嵌套字典值?

Posted

技术标签:

【中文标题】检查嵌套字典值?【英文标题】:Check nested dictionary values? 【发布时间】:2013-09-05 20:32:57 【问题描述】:

对于大量嵌套字典,我想检查它们是否包含键。 它们中的每一个都可能有也可能没有嵌套字典之一,所以如果我循环搜索所有这些字典会引发错误:

for Dict1 in DictionariesList:
     if "Dict4" in Dict1['Dict2']['Dict3']:
         print "Yes"

到目前为止我的解决方案是:

for Dict1 in DictionariesList:    
    if "Dict2" in Dict1:
        if "Dict3" in Dict1['Dict2']:
            if "Dict4" in Dict1['Dict2']['Dict3']:
                print "Yes"

但这是一个令人头疼的、丑陋的,并且可能不是很有效的资源。 哪种方法是正确的以第一种方式执行此操作,但在字典不存在时不会引发错误?

【问题讨论】:

【参考方案1】:

使用 .get() 和空字典作为默认值:

if 'Dict4' in Dict1.get('Dict2', ).get('Dict3', ):
    print "Yes"

如果Dict2 键不存在,则返回一个空字典,因此下一个链接的.get() 也将找不到Dict3,并依次返回一个空字典。然后in 测试返回False

另一种方法是抓住KeyError

try:
    if 'Dict4' in Dict1['Dict2']['Dict3']:
        print "Yes"
except KeyError:
    print "Definitely no"

【讨论】:

令人惊叹,经过测试和工作,非常感谢。会尽快接受。你真是个忍者。 如果链中有任何None 值的键,第一个提案将失败。例如,测试不适用于Dict1 = 'Dict2': None。因此,似乎捕获异常是最干净的解决方案。 @AlexO:任何没有.get() 方法的对象都会失败,是的。该代码的工作不是考虑所有可能性。除非您明确需要支持不同的值类型,否则不要捕获该异常,因为这表明其他地方存在错误。 感谢您指出这一点(我目前正在从 Perl 切换,正在寻找 defined($Dict1'Dict2''Dict3') 表达式的 Python 等效项:)【参考方案2】:

try/except 块怎么样:

for Dict1 in DictionariesList:
    try:
        if 'Dict4' in Dict1['Dict2']['Dict3']:
            print 'Yes'
    except KeyError:
        continue # I just chose to continue.  You can do anything here though

【讨论】:

【参考方案3】:

以下是任意数量键的概括:

for Dict1 in DictionariesList:
    try: # try to get the value
        reduce(dict.__getitem__, ["Dict2", "Dict3", "Dict4"], Dict1)
    except KeyError: # failed
        continue # try the next dict
    else: # success
        print("Yes")

基于Python: Change values in dict of nested dicts using items in a list。

【讨论】:

以上是关于检查嵌套字典值?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字典值是不是在 python 的字典列表中可用?

Python检查字典中是不是存在值[重复]

如果数据框列值匹配字典键,检查不同的列是不是匹配字典值

如何检查字典python中是不是存在多个值

检查字典中的浮点值以了解 Python 中的条件

如何检查字典中的值是不是大于传递的值