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)
使用异常:
try:
print myDict['key1']['attr3']
except KeyError:
print "Can't find my keys"
Run Code Online (Sandbox Code Playgroud)
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)