Python - 从键列表中访问分层dict元素

时间:2015-12-10 18:56:35

标签: python dictionary recursion

我们说我有一个常规的" dict-of-dicts"如下:

d = {}
d['a'] = {}
d['a']['b'] = 3

我当然可以使用d['a']['b']访问该元素。

在我的情况下,我有一个递归应用程序,在其中我将当前状态保持为键列表。所以我会

my_key = ['a', 'b']

如何使用my_key访问值3?当然,问题是my_key可以任意长(深)。

我意识到我可以编写另一个遍历函数,但似乎应该有一种直接的方法。有什么想法吗?

2 个答案:

答案 0 :(得分:7)

您可以使用reduce使用不同的密钥对每个dict层进行迭代索引:

>>> from functools import reduce #only necessary in 3.X
>>> d = {}
>>> d['a'] = {} #I'm assuming this is what you meant to type
>>> d['a']['b'] = 3
>>> keys = ("a", "b")
>>> reduce(dict.get, keys, d)
3

答案 1 :(得分:1)

目前字典键只能是hashable种类型,listListType)不是其中之一,所以如果您尝试将列表指定为字典键:

{}[[]]

你会得到:

TypeError: unhashable type: 'list'`.

您可以增强当前字典,允许将列表指定为键,并迭代内部对象上的列表。这是代码(请注意,它只处理 get / 读取部分):

from types import DictType, ListType

class EnhancedDictType(DictType):
    def __getitem__(self, key):
        if key and isinstance(key, ListType):
            new_obj = self
            for item in key:
                new_obj = new_obj[item]
            return new_obj
        else:
            return super(EnhancedDictType, self).__getitem__(key)

dict = EnhancedDictType

这里还有一些测试代码:

d = dict()
d[1] = dict()
d[1][2] = dict({3: 4})
d[(1, 2, 3)] = 5
print d
print d[1]
print d[1][2]
print d[[1, 2]]
print d[[1 ,2, 3]]
print d[(1, 2, 3)]