如何使用.get()获取嵌套字典键值

alp*_*ric 15 python dictionary nested

使用简单的字典,如:

myDict{'key1':1, 'key2':2}
Run Code Online (Sandbox Code Playgroud)

我可以安全地使用:

print myDict.get('key3')
Run Code Online (Sandbox Code Playgroud)

即使'key3'不存在也不会抛出错误,因为.get()仍会返回None.

现在,我将如何使用嵌套键字典实现相同的简单性:

myDict={}
myDict['key1'] = {'attr1':1,'attr2':2}
Run Code Online (Sandbox Code Playgroud)

以下将给出一个KeyError:

print myDict.get('key1')['attr3']
Run Code Online (Sandbox Code Playgroud)

这将通过:

print myDict.get('key1').get('attr3')
Run Code Online (Sandbox Code Playgroud)

但它会因adn AttributeError而失败:'NoneType'对象没有属性'get':

print myDict.get('key3').get('attr1')
Run Code Online (Sandbox Code Playgroud)

fal*_*tru 28

dict.get接受其他default参数.如果没有这样的键,value则返回而不是None.

print myDict.get('key1', {}).get('attr3')
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果显式设置了“myDict['key1'] = None”,则“myDict.get('key1', {})”仍然可以返回“None”。我实际上会推荐[这个](/sf/answers/1642459661/)方法。 (2认同)

Rob*_*obᵩ 5

使用异常:

try:
    print myDict['key1']['attr3']
except KeyError:
    print "Can't find my keys"
Run Code Online (Sandbox Code Playgroud)


jxs*_*ord 5

Dan O'Huiginn有一篇非常不错的博客文章,主题是嵌套词典。他最终建议使用更好地处理嵌套的类来对dict进行子类化。这是修改后的子类,以处理尝试访问非字典值键的情况:

class ndict(dict):
     def __getitem__(self, key):
         if key in self: return self.get(key)
         return self.setdefault(key, ndict())
Run Code Online (Sandbox Code Playgroud)

您可以引用嵌套的现有键或不存在的键。您可以安全地使用方括号表示法而不是.get()进行访问。如果NestedDict对象上不存在键,则将返回一个空的NestedDict对象。初始化有点麻烦,但是如果您需要功能,可以为您解决。这里有些例子:

In [97]: x = ndict({'key1': ndict({'attr1':1, 'attr2':2})})

In [98]: x
Out[98]: {'key1': {'attr1': 1, 'attr2': 2}}

In [99]: x['key1']
Out[99]: {'attr1': 1, 'attr2': 2}

In [100]: x['key1']['key2']
Out[100]: {}

In [101]: x['key2']['key2']
Out[101]: {}

In [102]: x['key1']['attr1']
Out[102]: 1
Run Code Online (Sandbox Code Playgroud)