检查字典键是否存在并有价值的有效方法
Efficient way to check if dictionary key exists and has value
假设有一本字典如下所示:
d = {"key1": "value1", "key2": {"key3": "value3"}}
字典可能包含也可能不包含 key2
,而且 key2
可能为空。因此,为了获得 value3
,我需要检查 key2
及其值是否存在非空值,同样适用于 key3
.
现在最愚蠢的解决方案是这样的:
if 'key2' in d:
if d['key2']:
if 'key3' in d['key2']:
value = d['key2']['key3']
现在,我想知道是否有更简单的解决方案,这样我就不必连续写 3 if
s。
一种方法是预料到失败并抓住它:
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']
如果您要在 else
部分(例如 None
)中将其他内容分配给 value
,您还可以考虑:
value = d['key2']['key3'] if 'key2' in d and d['key2'] and 'key3' in d['key2'] else None
您可以使用 .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.")
假设有一本字典如下所示:
d = {"key1": "value1", "key2": {"key3": "value3"}}
字典可能包含也可能不包含 key2
,而且 key2
可能为空。因此,为了获得 value3
,我需要检查 key2
及其值是否存在非空值,同样适用于 key3
.
现在最愚蠢的解决方案是这样的:
if 'key2' in d:
if d['key2']:
if 'key3' in d['key2']:
value = d['key2']['key3']
现在,我想知道是否有更简单的解决方案,这样我就不必连续写 3 if
s。
一种方法是预料到失败并抓住它:
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']
如果您要在 else
部分(例如 None
)中将其他内容分配给 value
,您还可以考虑:
value = d['key2']['key3'] if 'key2' in d and d['key2'] and 'key3' in d['key2'] else None
您可以使用 .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.")