Python - 附加到嵌套在dict子类中的列表

时间:2012-10-18 15:23:08

标签: python list dictionary append subclass

我有一个dict子类,其作用是动态添加嵌套的dict键(如果它不存在),如果调用append则执行list append:

class PowerDict(dict):
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value
    def append(self,item):
        if type(self) != list:
            self = list()
            self.append(item)

所以

a = PowerDict()
a['1']['2'] = 3

产生输出:

a = {'1': {'2': 3}}

然而,有时我需要做这样的事情:

b = PowerDict()
b['1']['2'].append(3)
b['1']['2'].append(4)

应该产生输出:

b = {'1': {'2': [3, 4]}}

但上面的代码产生输出:

{'1': {'2': {}}}

我缺少什么?

3 个答案:

答案 0 :(得分:1)

class PowerDict(dict):
    # http://stackoverflow.com/a/3405143/190597 (gnibbler)
    def __init__(self, parent = None, key = None):
        self.parent = parent
        self.key = key
    def __missing__(self, key):
        self[key] = PowerDict(self, key)
        return self[key]
    def append(self, item):
        self.parent[self.key] = [item]
    def __setitem__(self, key, val):
        dict.__setitem__(self, key, val)
        try:
            val.parent = self
            val.key = key
        except AttributeError:
            pass

a = PowerDict()
a['1']['2'] = 3
print(a)

b = PowerDict()
b['1']['2'].append(3)
b['1']['2'].append(4)
print(b)

a['1']['2'] = b
a['1']['2'].append(5)
print(a['1']['2'])

产量

{'1': {'2': 3}}
{'1': {'2': [3, 4]}}
[5]

答案 1 :(得分:0)

你的append()方法永远不会有效。通过执行self = list(),您只需将名称self重新分配给新列表,然后将其丢弃。

而且我不明白你要做什么 - 从getitem开始,如果有什么东西丢失,你就会动态创建新的词典......你会如何混合列表行为呢?

答案 2 :(得分:0)

你的一个问题是重新分配自己,然而,不是这样。尝试在append命令中打印出self的值,你可以看到另一个问题:循环进入无限递归。这是因为你在append命令中的powerDict上调用了append命令!

这可以在不重写append命令的情况下解决您的问题,但我强烈建议您重新编写它以避免上述问题:

b['1']['2']= [3]
b['1']['2'].append(4)