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

2024-10-01 15:39:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)

所以

^{pr2}$

产出:

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

但是,有时我需要做这样的事情:

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

应产生输出:

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

但上面的代码会产生输出:

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

我错过了什么?在


Tags: selfreturnvaluedeftype动态item子类
3条回答

append()方法永远无法工作。通过执行self = list()操作,您只需将名称self重新指派给一个新列表,然后将其丢弃。在

我不明白你想做什么-从getitem开始,如果有什么东西丢失了,你就是在动态地创建新的字典。。。你会如何混合列表行为?在

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'])

收益率

^{2}$

你的问题之一是重新分配自我,然而,这不是问题所在。尝试在append命令中打印self的值,您会看到另一个问题:循环进入无限递归。这是因为您在append命令中对powerDict调用append命令!在

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

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

相关问题 更多 >

    热门问题