如何从字典中删除最旧的元素?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从字典中删除最旧的元素?相关的知识,希望对你有一定的参考价值。
我想知道删除字典中最旧的元素以控制字典大小的最佳方法。
例:
MAXSIZE = 4
dict = {}
def add(key,value):
if len(dict) == MAXSIZE:
old = get_oldest_key() # returns the key to the oldest item
del dict[old]
dict[key] = value
add('a','1') # {'a': '1'}
add('b','2') # {'a': '1', 'b': '2'}
add('c','3') # {'a': '1', 'c': '3', 'b': '2'}
add('d','4') # {'a': '1', 'c': '3', 'b': '2', 'd': '4'}
add('e','5') # {'c': '3', 'b': '2', 'e': '5', 'd': '4'}
这个清楚了吗?
编辑:忘了len(dict)
落后一个项目。
字典不保留顺序,因此您无法确定首先添加了哪个元素。您可以将字典与其键的列表组合以保留顺序。
这是一个有序的字典的activestate recipe就是这样做的。
Python 3.1有一个有序的字典。使用类collections.OrderedDict
来保持元素的插入顺序。请注意,如果要覆盖一个元素,它会按顺序保留其位置,您需要删除并重新插入一个元素以使其最后。
如果您使用的是旧版本,则可以使用补丁来获取OrderedDict。
无论如何,如果它不可用,你可以简单地使用一个元组列表:它可以很容易地转换为字典,保持其排序,可以像append
和pop
的队列一样使用,...
一种方法是将密钥存储在一个数组中,这将保留您的订单。就像是:
MAXSIZE = 4
dict = {}
history = []
def add(key,value):
print len(dict)
if len(dict) == MAXSIZE:
old = history.pop(0) # returns the key to the oldest item
del dict[old]
history.append(key)
dict[key] = value
此外,请记住,len()
总是落后一个项目。当你添加你的第五个项目时,len(dict)
是4
,而不是5
。你应该使用==
而不是>
。
除非你有一些设定数量的元素,你知道哪一个是最老的,那么你可以简单地删除它。否则,您正在使用错误的数据结构来实现我的想法。
编辑:虽然,根据快速谷歌,我遇到this.哦,我喜欢collections
模块:)
我相信LRU dict-like container将满足您的需求。
或者,也可以使用元组列表。
MAXSIZE = 4
stack = []
def add(key, value):
stack.append((key, value))
if len(stack) > MAXSIZE:
stack.pop(0)
print stack
add('a','1')
add('b','2')
add('c','3')
add('d','4')
add('e','5')
结果是
[('a', '1')]
[('a', '1'), ('b', '2')]
[('a', '1'), ('b', '2'), ('c', '3')]
[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')]
[('b', '2'), ('c', '3'), ('d', '4'), ('e', '5')]
请注意,使用此方法会降低字典查找的速度。因此,如果您需要定制的有序字典可能是有序的。
你可以找到pocoo团队here的实现。我总是发现他们的工作很出色。
不知道你真正想要使用这个结构的是什么,这里有一些可能对你有用的东西:
class DictCache:
def __init__(self, maxcount=4):
self.data = {}
self.lru = []
self.maxcount = maxcount
def add(self, key, value):
self.data[key] = value
self.lru.append(key)
if len(self.lru) > self.maxcount:
dead = self.lru.pop(0)
del(self.data[dead])
将此与get
方法结合使用,可以在访问时重新排列self.lru
,并且您可以更改缓存策略以适合您的用例。
这样怎么样?把命令放在数组中,当达到限制时,弹出它。
MAXSIZE = 4
dict,order= {},[]
def add(key,value):
if len(dict) > MAXSIZE:
old = order.pop() # returns the key to the oldest item
del dict[old]
order.insert(0,key)
dict[key] = value
以上是关于如何从字典中删除最旧的元素?的主要内容,如果未能解决你的问题,请参考以下文章