Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何安全地检查python字典是否递归存储了多个密钥字典对_Python_Dictionary_Try Catch - Fatal编程技术网

如何安全地检查python字典是否递归存储了多个密钥字典对

如何安全地检查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

如果我有一个dict,d,我想检查
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:)