使用一个简单的字典,如:
myDict = {'key1':1, 'key2':2}
我可以安全地使用:
print myDict.get('key3')
,即使'key3'不存在,也不会抛出错误,因为.get()仍然返回None。
现在我如何使用嵌套键字典实现同样的简单性:
myDict={}
myDict['key1'] = {'attr1':1,'attr2':2}
下面将给出KeyError:
print myDict.get('key1')['attr3']
这将通过:
print myDict.get('key1').get('attr3')
但是它会失败,并出现AttributeError: 'NoneType'对象没有属性'get':
print myDict.get('key3').get('attr1')
dict.get
接受附加的default
参数。如果没有这样的键,则返回value
而不是None
。
print myDict.get('key1', {}).get('attr3')
Dan O'Huiginn有一篇很好的博客文章是关于嵌套字典的。他最后建议用一个能更好地处理嵌套的类来继承dict。下面是修改后的子类,以处理尝试访问非字典值的键的情况:
class ndict(dict):
def __getitem__(self, key):
if key in self: return self.get(key)
return self.setdefault(key, ndict())
可以引用嵌套的现有键或不存在的键。您可以安全地使用括号符号进行访问,而不是使用.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
使用例外:
try:
print myDict['key1']['attr3']
except KeyError:
print "Can't find my keys"
这很正常,因为key3不存在,所以
myDict.get('key3')
返回none . .
NoneType对象没有属性..
所以你必须存储mydict。get('key3')的值,测试它是否为null然后对存储的项目使用get方法
NestedDict
允许您使用与标准字典相同的接口处理嵌套字典。
from ndicts.ndicts import NestedDict
my_dict = {'key1': {'attr1': 1,'attr2': 2}
nd = NestedDict(my_dict)
>>> nd.get(("key1", "attr3"), "not found")
'not found'
>>> nd.get(("key3", "attr1"), "not found")
'not found'
安装索引
pip install ndicts
我改进了jxstandford提出的在dict中处理list的解决方案。
class NestedDict(dict):
def __getitem__(self, key):
if key in self:
return self.to_nested(self.get(key))
return self.setdefault(key, NestedDict())
@staticmethod
def to_nested(obj: Any) -> Any:
if not obj:
return NestedDict()
if isinstance(obj, dict):
return NestedDict(obj)
if isinstance(obj, list):
return list(map(NestedDict.to_nested, obj))
return obj
所以它可以像这样处理字典:
foo = {"bar": [{"a:":3}]}
{} == foo["bar"][0]["b"]