如何安全地检查python字典是否递归存储了多个密钥字典对
如果我有一个dict,d,我想检查如何安全地检查python字典是否递归存储了多个密钥字典对,python,dictionary,try-catch,Python,Dictionary,Try Catch,如果我有一个dict,d,我想检查d['e']['foo']['bar']中的一个值,其中e和foo是字典,bar给出了一个字符串,那么安全获取该位置值的方法是什么?除了试一试之外还有什么吗?请确保钥匙在这张纸上,您可以试一试: if "e" in d: print d["e"] 或者尝试使用方法,若键不可用,则返回默认值 如果键在字典中,则返回键的值,否则为默认值。如果 默认值未给定,它默认为“无”,因此此方法不会 引发一个键错误 确保钥匙在此目录中,您可以尝试以下操作: if "e
d['e']['foo']['bar']
中的一个值,其中e和foo是字典,bar给出了一个字符串,那么安全获取该位置值的方法是什么?除了试一试之外还有什么吗?请确保钥匙在这张纸上,您可以试一试:
if "e" in d:
print d["e"]
或者尝试使用方法,若键不可用,则返回默认值
如果键在字典中,则返回键的值,否则为默认值。如果
默认值未给定,它默认为“无”,因此此方法不会
引发一个键错误
确保钥匙在此目录中,您可以尝试以下操作:
if "e" in d:
print d["e"]
或者尝试使用方法,若键不可用,则返回默认值
如果键在字典中,则返回键的值,否则为默认值。如果
默认值未给定,它默认为“无”,因此此方法不会
引发一个键错误
使用默认为空字典的
get
:
>>> d = {'e':{'foo':{'bar':0}}}
>>> print(d.get('e', {}).get('foo', {}).get('bar'))
0
>>> print(d.get('f', {}).get('doo', {}).get('car'))
None
>>> print(d.get('e', {}).get('foo', {}).get('car'))
None
>>> print(d.get('e', {}).get('doo', {}).get('bar'))
None
使用默认为空字典的
get
:
>>> d = {'e':{'foo':{'bar':0}}}
>>> print(d.get('e', {}).get('foo', {}).get('bar'))
0
>>> print(d.get('f', {}).get('doo', {}).get('car'))
None
>>> print(d.get('e', {}).get('foo', {}).get('car'))
None
>>> print(d.get('e', {}).get('doo', {}).get('bar'))
None
一种方法是使用一个简单的辅助函数:
def dive(d, *ks):
for k in ks:
if isinstance(d, dict) and k in d:
d = d[k]
else:
return None
return d
examples = [
{},
{'e': {'foo': 12}},
{'e': {'foo': {'bar': 999}}},
]
for i, e in enumerate(examples):
print(i, dive(e, 'e', 'foo', 'bar'))
输出:
(0, None)
(1, None)
(2, 999)
一种方法是使用一个简单的辅助函数:
def dive(d, *ks):
for k in ks:
if isinstance(d, dict) and k in d:
d = d[k]
else:
return None
return d
examples = [
{},
{'e': {'foo': 12}},
{'e': {'foo': {'bar': 999}}},
]
for i, e in enumerate(examples):
print(i, dive(e, 'e', 'foo', 'bar'))
输出:
(0, None)
(1, None)
(2, 999)
一个好方法是使用
reduce
d={'e':{'foo':{'bar':"final value"}}}
l=['e','foo','bar']
print reduce(lambda x,y:x.get(y),l, d)
您可以创建函数
并将列表
传递给它
输出:
最终值
一个好方法是使用减少
d={'e':{'foo':{'bar':"final value"}}}
l=['e','foo','bar']
print reduce(lambda x,y:x.get(y),l, d)
您可以创建函数
并将列表
传递给它
输出:
final value
您可以尝试使用collections.defaultdict()
s。请参阅@synchronizer,然后检查该值是否为“真实”值。谢谢为了确保这一点,我正在编写一个快速程序来验证我所说的。*不,我似乎只能得到一个嵌套的defaultdict@synchronizer您可以尝试使用collections.defaultdict()
s。请参阅@synchronizer,然后检查该值是否为“真实”值。谢谢为了确保这一点,我正在编写一个快速程序来验证我所说的。*不,我似乎只能得到一个嵌套的defaultdict@synchronizer我试图避开长长的锁链。但从技术上讲,这是可行的。我试图避免长链条。但从技术上讲,这是可行的。@但如果缺少密钥对,则会出现异常。我认为添加.get(y,默认值)可以消除这种情况。不过我会得到一个类型异常。get@Bren但在任何情况下,您都必须处理这种情况……但在这种方法中,您可以在列表中使用变量值……这是一个通用函数……我将错误处理留给您……。get
的默认值为None
。您可以使用异常
der@Bren这一切都会成功的长链条和小链条ones@Bren对于不需要用户提供try except
的版本,修改如下:x.get(y)if x else None
@FMc.get默认返回None:)@但是如果缺少密钥-值对,则会出现异常。我认为添加.get(y,默认值)可以消除这种情况。不过我会得到一个类型异常。get@Bren但在任何情况下,您都必须处理这种情况……但在这种方法中,您可以在列表中使用变量值……这是一个通用函数……我将错误处理留给您……。get
的默认值为None
。您可以使用异常
der@Bren这一切都会成功的长链条和小链条ones@Bren对于不需要用户提供try except
的版本,可以这样修改:x.get(y)if x else None
@FMc.get默认返回None:)