使用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)])
........................................
从运行结果可以理清思路