collections中的OrderedDict

来源:互联网 发布:sap数据导入 编辑:程序博客网 时间:2024/06/14 06:44

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。而如果要保持Key的顺序,可以用OrderedDict

注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:

class LastUpdatedOrderedDict(OrderedDict):    def __init__(self, capacity):        super().__init__()        #super(LastUpdatedOrderedDict, self).__init__()        self._capacity = capacity    def __setitem__(self, key, value):                 containsKey = 1 if key in self else 0        print('self1:',self)        print('len(self):',len(self))        # 如果dict容量已满        if len(self) - containsKey >= self._capacity:            print('%s(len) - %s(containsKey)>= %s(self._capacity):'                  % (len(self),containsKey,self._capacity))            # 则删除最先添加的key            last = self.popitem(last=False)            print('remove:', last)            print('self2:',self)        # 检查dict里是否已经存在要增加的(key,value)中的key        if containsKey:            # 删除原来的key            del self[key]            print('set:', (key, value))            print('self3:',self)        # 如果dict中没有要添加的key        else:            print('add:', (key, value))            print('self4:',self)                OrderedDict.__setitem__(self, key, value)        print('self5:',self)dic=LastUpdatedOrderedDict(2)dic['a']=1print('.......')dic['b']=2print('.......')dic['c']=3print('.......')dic['b']=6

结果:

........................................self1: LastUpdatedOrderedDict()len(self): 0add: ('a', 1)self6: LastUpdatedOrderedDict()self7: LastUpdatedOrderedDict([('a', 1)]).......self1: LastUpdatedOrderedDict([('a', 1)])len(self): 1add: ('b', 2)self6: LastUpdatedOrderedDict([('a', 1)])self7: LastUpdatedOrderedDict([('a', 1), ('b', 2)]).......self1: LastUpdatedOrderedDict([('a', 1), ('b', 2)])len(self): 22(len) - 0(containsKey)>= 2(self._capacity):remove: ('a', 1)self3: LastUpdatedOrderedDict([('b', 2)])add: ('c', 3)self6: LastUpdatedOrderedDict([('b', 2)])self7: LastUpdatedOrderedDict([('b', 2), ('c', 3)]).......self1: LastUpdatedOrderedDict([('b', 2), ('c', 3)])len(self): 2set: ('b', 6)self5: LastUpdatedOrderedDict([('c', 3)])self7: LastUpdatedOrderedDict([('c', 3), ('b', 6)])........................................

从运行结果可以理清思路

原创粉丝点击