检查字典键是否存在并具有值的有效方法

时间:2021-04-04 01:22:37

标签: python dictionary key-value

假设有一本看起来像这样的字典:

d = {"key1": "value1", "key2": {"key3": "value3"}}

字典可能包含也可能不包含 key2key2 也可能为空。因此,为了获得 value3,我需要检查 key2 及其值是否存在非空值,同样适用于 key3

现在显而易见的愚蠢解决方案是这样的:

if 'key2' in d:
    if d['key2']:
        if 'key3' in d['key2']:
            value = d['key2']['key3']

现在,我想知道是否有更简单的解决方案,这样我就不必连续写 3 个 if

2 个答案:

答案 0 :(得分:2)

您可以使用带有默认值的 .get()

val = d.get("key2", {}).get("key3", None)  # <-- you can put something else instead of `None`, this value will return if key2 or key3 doesn't exist

例如:

d = {"key1": "value1", "key2": {"key3": "value3"}}

val = d.get("key2", {}).get("key3", None)

if not val is None:
    print(val)
else:
    print("Not found.")

答案 1 :(得分:1)

一种方法是预期失败并抓住它:

try:
    value = d['key2']['key3']
except (KeyError, TypeError):
    pass

(不要将变量称为类型名称,这是一种不好的做法,我已将其重命名为 d

KeyError 捕获丢失的键,TypeError 捕获试图索引不是 dict 的内容。

如果您预计这种失败很常见,这可能并不理想,因为 try .. except 块会产生一些开销。

在那种情况下,你会被你所拥有的东西困住,尽管我会写成:

if 'key2' in d and d['key2'] and 'key3' in d['key2']:
    value = d['key2']['key3']

或者更清楚一点:

if 'key2' in d and isinstance(d['key2'], dict) and 'key3' in d['key2']:
    value = d['key2']['key3']

如果您要为 value 部分中的 else 分配其他内容(例如 None),您还可以考虑:

value = d['key2']['key3'] if 'key2' in d and d['key2'] and 'key3' in d['key2'] else None
    
相关问题