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

4
假设我有一个常规的“字典嵌套字典”,如下所示:
d = {}
d['a'] = {}
d['a']['b'] = 3

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

在我的情况下,我有一个递归应用程序,其中我将当前状态作为键的列表。因此,我会有:

my_key = ['a', 'b']

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

我知道我可以编写另一个遍历函数或类似操作,但似乎应该有一种简单明了的方法。您有什么想法吗?


我不认为这是一个常见(或明智)的情况,需要一个函数来证明。只需编写自己的函数 - 就像4行代码一样简单。 - maniexx
你能修复一下你的示例吗?因为它毫无意义。另外,键可以嵌套多深呢? - Padraic Cunningham
@PadraicCunningham 抱歉,现在已经修复了。 - user1496984
2个回答

9
您可以使用reduce逐层使用不同的键索引字典中的每一层:
>>> 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

正是我所需要的!谢谢! - user1496984

1

目前字典的键只能是可哈希的类型,list (ListType) 不属于其中之一,因此如果您尝试将列表指定为字典键:

{}[[]]

你会得到:

TypeError: unhashable type: 'list'`.

你可以增强当前的字典,允许指定一个列表作为键,并在内部对象上迭代该列表。以下是代码(请注意,它只处理get/read部分):
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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接