【问题标题】:How to remove the oldest element from a dictionary?如何从字典中删除最旧的元素?
【发布时间】:2010-12-17 22:31:07
【问题描述】:

我想知道删除字典中最旧元素以控制最大字典大小的最佳方法。

示例:

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)落后一项。

【问题讨论】:

  • oldest 是字典中最先添加的项目。 (看例子)
  • 我对大部分回复投了赞成票,因为他们很好地回答了这个问题。我选择 JimB 响应是因为它是最适合我需要的答案。我会尽快发布我使用它的实现。

标签: python dictionary


【解决方案1】:

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

如果您使用的是旧版本,可能会提供一个补丁来获取 OrderedDict。

无论如何,如果它不可用,您可以简单地使用元组列表:它可以轻松地与字典相互转换,保持其顺序,可以像append 和pop 的队列一样使用, ...

【讨论】:

  • 使用列表作为队列不会扩展。 collections.deque 更适合这个。
【解决方案2】:

现在订购 Python 字典(从 3.6 及更高版本开始)。 more details
next(iter(dict)) 将给出最旧的(或第一个)密钥。 stackoverflow answer

所以要删除最旧的(或第一个)键,我们可以使用以下...

dict.pop(next(iter(dict)))

【讨论】:

    【解决方案3】:

    字典不保留顺序,因此您无法分辨哪个元素首先添加。您可以将字典与它的键列表结合起来以保持顺序。

    这是一个 activestate recipe 用于执行此操作的有序字典。

    还有 PEP-0372 和 patch 用于 odict 类。

    【讨论】:

    • 从 Python 3.7 开始,Python dicts 保持顺序。
    【解决方案4】:

    执行此操作的一种方法是将键存储在数组中,这将为您保留订单。比如:

    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。您应该使用== 而不是>。

    【讨论】:

      【解决方案5】:

      除非你有某种固定数量的元素,你知道哪个是最旧的,那么你可以简单地删除它。否则,我认为你正在使用错误的数据结构。

      编辑:不过,根据一个快速的谷歌,我遇到了 this. 哦,我确实喜欢 collections 模块 :)

      【讨论】:

        【解决方案6】:

        我相信LRU dict-like container 将最适合您的需求。

        【讨论】:

          【解决方案7】:

          或者,也可以使用元组列表。

          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 的实现。我一直觉得他们的工作非常出色。

          【讨论】:

            【解决方案8】:

            在不知道你真正想用这个结构做什么的情况下,这里是 可能对你有用的东西:

            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])
            

            将此与重新排列self.lru 的get 方法结合使用 当它们被访问时,您可以更改缓存策略以适应您的 用例。

            【讨论】:

              【解决方案9】:

              这样怎么样?将顺序放入数组中,当达到限制时,弹出它。

              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
              

              【讨论】:

                猜你喜欢
                • 2015-03-16
                • 1970-01-01
                • 2011-12-24
                • 1970-01-01
                • 2013-06-15
                • 1970-01-01
                • 1970-01-01
                • 2021-04-09
                • 2015-12-30
                相关资源
                最近更新 更多