collections中的OrderedDict

使用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']=1
print('.......')
dic['b']=2
print('.......')
dic['c']=3
print('.......')
dic['b']=6

结果:

........................................
self1: LastUpdatedOrderedDict()
len(self): 0
add: ('a', 1)
self6: LastUpdatedOrderedDict()
self7: LastUpdatedOrderedDict([('a', 1)])
.......
self1: LastUpdatedOrderedDict([('a', 1)])
len(self): 1
add: ('b', 2)
self6: LastUpdatedOrderedDict([('a', 1)])
self7: LastUpdatedOrderedDict([('a', 1), ('b', 2)])
.......
self1: LastUpdatedOrderedDict([('a', 1), ('b', 2)])
len(self): 2
2(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): 2
set: ('b', 6)
self5: LastUpdatedOrderedDict([('c', 3)])
self7: LastUpdatedOrderedDict([('c', 3), ('b', 6)])
........................................

从运行结果可以理清思路

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值