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

Sam*_*amy 5 python dictionary key-value

假设有一本字典,如下所示:

d = {"key1": "value1", "key2": {"key3": "value3"}}
Run Code Online (Sandbox Code Playgroud)

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

现在明显愚蠢的解决方案是这样的:

if 'key2' in d:
    if d['key2']:
        if 'key3' in d['key2']:
            value = d['key2']['key3']
Run Code Online (Sandbox Code Playgroud)

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

And*_*ely 6

您可以使用.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
Run Code Online (Sandbox Code Playgroud)

例如:

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

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

if not val is None:
    print(val)
else:
    print("Not found.")
Run Code Online (Sandbox Code Playgroud)


Gri*_*mar 2

一种方法是预期失败并捕获它:

try:
    value = d['key2']['key3']
except (KeyError, TypeError):
    pass
Run Code Online (Sandbox Code Playgroud)

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

捕获KeyError一个丢失的键,TypeError捕获试图索引不是一个的东西dict.

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

在这种情况下,尽管我将其写为:

if 'key2' in d and d['key2'] and 'key3' in d['key2']:
    value = d['key2']['key3']
Run Code Online (Sandbox Code Playgroud)

或者也许更清楚一点:

if 'key2' in d and isinstance(d['key2'], dict) and 'key3' in d['key2']:
    value = d['key2']['key3']
Run Code Online (Sandbox Code Playgroud)

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

value = d['key2']['key3'] if 'key2' in d and d['key2'] and 'key3' in d['key2'] else None
    
Run Code Online (Sandbox Code Playgroud)