需要修改版的Python Dictionary

时间:2018-05-20 17:09:18

标签: python dictionary

如果想要更改字典的默认行为,需要更改哪些方法?

我所知道的一些方法,如__getitem__(), __missing__(), __iter__()等。

我正在尝试以这样的方式实现字典:如果我尝试将值赋值给key(已经存在),那么旧值不应该消失,而应保留在某个列表中,当我们尝试删除像pop(key)这样的键,它应该删除旧的值。

需要修改哪些方法来覆盖dict类才能实现此行为?

1 个答案:

答案 0 :(得分:1)

您要更新的是__setitem__方法。您希望它在您的字典中设置新密钥时创建列表,并在密钥存在时附加到该列表。然后,您还可以扩展__getitem__方法,以便在列表中获取所需项目的索引。至于pop方法,您还需要覆盖dict.pop

class ListDict(dict):
    def __setitem__(self, key, value):
        if key not in self:
            super().__setitem__(key, [])

        self[key].append(value)

    def __getitem__(self, item):
        if isinstance(item, tuple):
            item, pos = item
            return super().__getitem__(item)[pos]
        else:
            return super().__getitem__(item)

    def pop(self, k):
        v = self[k].pop(0)
        if not self[k]:
            super().__delitem__(k)
        return v

示例:

# Setting items
d = ListDict()
d['foo'] = 'bar'
d['foo'] = 'baz'
d  # {'foo': ['bar', 'baz']}

# Getting items
d['foo', 0]  # 'bar'
d['foo', 1]  # 'baz'
d['foo', 0:2]  # ['bar', 'baz']

# Popping a key
d.pop('foo')
d  # {'foo': ['baz']}
d.pop('foo')
d  # {}