用OrderedDict实现一个FIFO的dict,当容量超出限制的时候,先删除最先添加的key

来源:互联网 发布:欧莱雅精油怎么样知乎 编辑:程序博客网 时间:2024/05/29 15:16
#!\usr\bin\python# coding=utf-8from collections import OrderedDictclass LastUpdateOrderDict(OrderedDict):    def __init__(self, capacity):        super(LastUpdateOrderDict, self).__init__()        '''是对继承自父类的属性进行初始化。而且是用父类的初始化方法来初始化继承的属性。        例如这样,父类对name和gender的初始化只是简单的赋值,        但子类要求字母全部大写。        '''        self._capacity = capacity        #init方法在父类OrderedDict的__init__方法基础上,为LastUpdatedOrderedDict类添加了一个_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:            last = self.popitem(last=False)        # popitem移除键值对并返回,last=true时按LIFO顺序返回        # last=false时按FIFO顺序返回            print 'remove', last        if containskey:            del self[key]            print 'set:', (key, value)
        else:#key值不在里面            print 'add', (key, value)        OrderedDict.__setitem__(self, key, value)        # 调用父类的__setitem__方法写入键值对m_od = LastUpdateOrderDict(2)# 容量为2,输入3个值时,会先将最先存入的删除再添加新的m_od['a'] = 1m_od['b'] = 2m_od['c'] = 3print(m_od)
结果:
E:\Python27\python.exe E:/PycharmProjects/file/.idea/thecollectionsfile.pyadd ('a', 1)add ('b', 2)remove ('a', 1)add ('c', 3)LastUpdateOrderDict([('b', 2), ('c', 3)])
出现的问题:
1,我开始将文件名字命名为collections.py ,结果在
from collections import OrderedDict导入包时出错了
提示:无法导入包
因为文件名和模块名字重复,将名字改成其他的之后,就可以导入了
2,为什么要在此处写
if containskey:            del self[key]            print 'set:', (key, value)
因为如果你del的话,再次添加的时候,就只是update,打印的时候,键值对是在前面的
这是一个有序的字典,并且要后插入的键值对位于后面,如果不del key,在__setitem__的时候,
只会更新原来的数组,此处要del key 打乱之前的结构,再进行键对值的插入
原创粉丝点击