Discuss / Python / 有序字典的那段代码解释

有序字典的那段代码解释

Topic source

注释很清楚了

from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
    def __init__(self, capacity): # capacity:容量
        # 调用父类OrderedDict的构造函数,下面要用到父类的popitem等方法
        super().__init__()
        self._capacity = capacity
    def __setitem__(self, key, value):
        # containsKey=1时表示key已存在,则执行修改操作
        # containsKey=0时表示key不存在,则执行添加操作
        containsKey = 1 if key in self else 0
        # 当已达最大容量,当新加key不存在时,会运行这段,先删除最先添加的
        # 当key存在时,不会运行这段,会运行第2个if进行修改
        if len(self) - containsKey >= self._capacity:
            # popitem移除键值对并返回,last=true时按LIFO顺序返回
            # last=false时按FIFO顺序返回
            last = self.popitem(last=False)
            print('remove:', last)
        if containsKey:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        # 调用父类的__setitem__方法写入键值对
        OrderedDict.__setitem__(self, key, value)

m_od = LastUpdatedOrderedDict(2)
# 容量为2,输入3个值时,会先将最先存入的删除再添加新的
m_od['a'] = 1
m_od['b'] = 2
m_od['c'] = 3
print(m_od)

滑动解锁_

#2 Created at ... [Delete] [Delete and Lock User]

super().init() 和 super(LastUpdatedOrderedDict, self).init() 有什么区别?效果一样吗?

一个是2的语法,一个是3的语法,3两种都支持。

houbo111

#4 Created at ... [Delete] [Delete and Lock User]

下面setitem最后为什么不用super().setitem了呢?

廖雪峰

#5 Created at ... [Delete] [Delete and Lock User]

可以用super()

感谢这位哥们的注释让我大概看明白了。 这个代码有个问题:

        if containsKey:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        OrderedDict.__setitem__(self, key, value)

看这里,他是无论输入的KEY是否存在,都先删了丫的,然后再添加,并不像print的那样分为set:和add: - - ||

这样比如值为{“a”:1,"b":2,"c":3}的字典 在修改了key“a”的值后:dict123['a'] = 4 这个有序字典的内容就变成了: {"b":2,"c":3,“a”:1} key “a” 的位置被挪动了啊。

最下面的OrderedDict.setitem, 不能用super参数不一样


  • 1

Reply