如何从字典中删除最旧的元素?

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就是这样做的。

还有PEP-0372和这个patch用于冒险课程。

另一答案

Python 3.1有一个有序的字典。使用类collections.OrderedDict来保持元素的插入顺序。请注意,如果要覆盖一个元素,它会按顺序保留其位置,您需要删除并重新插入一个元素以使其最后。

如果您使用的是旧版本,则可以使用补丁来获取OrderedDict。

无论如何,如果它不可用,你可以简单地使用一个元组列表:它可以很容易地转换为字典,保持其排序,可以像appendpop的队列一样使用,...

另一答案

一种方法是将密钥存储在一个数组中,这将保留您的订单。就像是:

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

以上是关于如何从字典中删除最旧的元素?的主要内容,如果未能解决你的问题,请参考以下文章

git stash drop 最旧的存储(比如最旧的 5 个存储)

删除最旧的项目时防止 ListView 垂直滚动

从最新到最旧的python对Mongo列表进行排序[重复]

Android Sqlite 根据日期列删除最旧的重复结果

Hazelcast - 最旧的条目首先被驱逐

我想让我的数据库里只保存最新的十条记录,超过十条,删除最旧的一条