首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用元组访问深度嵌套的字典?

如何使用元组访问深度嵌套的字典?
EN

Stack Overflow用户
提问于 2013-02-25 22:44:26
回答 1查看 2.2K关注 0票数 5

我想扩展一下the autovivification example,在nosklo给出的一个先前的答案中,允许通过元组访问字典。

nosklo的解决方案如下所示:

代码语言:javascript
复制
class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

测试:

代码语言:javascript
复制
a = AutoVivification()

a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6

print a

输出:

代码语言:javascript
复制
{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}

在这种情况下,我希望设置一个节点,给定一些任意的下标元组。如果我不知道元组有多少层深,我如何设计一种方法来设置适当的节点?

我在想,也许我可以使用如下语法:

代码语言:javascript
复制
mytuple = (1,2,3)
a[mytuple] = 4

但我想不出一个可行的方法。

更新

基于@JCash的回答,我有一个充分发挥作用的例子:

代码语言:javascript
复制
class NestedDict(dict):
    """                                                                       
    Nested dictionary of arbitrary depth with autovivification.               

    Allows data access via extended slice notation.                           
    """
    def __getitem__(self, keys):
        # Let's assume *keys* is a list or tuple.                             
        if not isinstance(keys, basestring):
            try:
                node = self
                for key in keys:
                    node = dict.__getitem__(node, key)
                return node
            except TypeError:
            # *keys* is not a list or tuple.                              
                pass
        try:
            return dict.__getitem__(self, keys)
        except KeyError:
            raise KeyError(keys)
    def __setitem__(self, keys, value):
        # Let's assume *keys* is a list or tuple.                             
        if not isinstance(keys, basestring):
            try:
                node = self
                for key in keys[:-1]:
                    try:
                        node = dict.__getitem__(node, key)
                    except KeyError:
                        node[key] = type(self)()
                        node = node[key]
                return dict.__setitem__(node, keys[-1], value)
            except TypeError:
                # *keys* is not a list or tuple.                              
                pass
        dict.__setitem__(self, keys, value)

它可以使用扩展片表示法实现与上面相同的输出:

代码语言:javascript
复制
d = NestedDict()
d[1,2,3] = 4
d[1,3,3] = 5
d[1,2,'test'] = 6
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-25 23:09:34

这似乎很管用

代码语言:javascript
复制
def __setitem__(self, key, value):
    if isinstance(key, tuple):
        node = self
        for i in key[:-1]:
            try:
                node = dict.__getitem__(node, i)
            except KeyError:
                node = node[i] = type(self)()
        return dict.__setitem__(node, i, value)
    return dict.__setitem__(self, key, value)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15077973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档