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



使用一个简单的字典,如:

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"]

相关内容

  • 没有找到相关文章

最新更新