2009-11-18 83 views
3

我想知道刪除字典中的最早的元素以便控制最大字典大小的最佳方法。從Python字典中刪除最老的元素

例如

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)落後

+1

定義「最早」 – jldupont 2009-11-18 15:59:01

+0

最早是詞典中第一次添加的項目。 (看例子) – 2009-11-18 16:13:16

+0

我投了大多數答覆,因爲他們很好地回答了這個問題。我選擇JimB的迴應,因爲它是最適合我需求的答案。我會盡力發佈我很快用到的實現。 – 2009-11-18 18:58:36

回答

7

字典一項不維持秩序,所以你不能告訴元素已經先加入。您可以將字典與其關鍵字列表結合起來以保持順序。

這是一個activestate recipe一個有序的字典,只是這樣做。

還有PEP-0372這個patch爲odict類。

3

除非你有某種設定數量的元素,你知道哪一個元素是最古老的,那麼你可以直接刪除它。否則,你正在使用錯誤的數據結構來處理你在做的事情。

編輯:雖然,根據快速谷歌,我遇到this.哦,我喜歡的collections模塊:)

2

一種方式做,這將是該鍵存儲在數組中,這將保存您的訂單。喜歡的東西:

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

12

Python 3.1有一個有序的字典。使用類collections.OrderedDict來保持元素的插入順序。注意,如果你覆蓋了一個元素,它會保持它的位置,你需要刪除並重新插入一個元素以使其最後。

如果您使用的是舊版本,可能會有補丁程序獲得OrderedDict。

無論如何,如果它不適用,您可以簡單地使用元組的列表:它可以很容易地轉換,並從一個字典,保持其排序,可以使用像appendpop,隊列...

+2

將列表用作隊列不會縮放。 'collections.deque'對此更好。 – 2010-03-13 07:39:08

0

不知道你真正想要使用此結構,這裏的 東西,可能爲你工作:

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 他們被訪問時結合這一點,喲你可以改變你的緩存策略,以適合你的 用例。

1

另外,也可以使用元組列表。

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找到實施。我一直覺得他們的工作非常出色。

0

這樣怎麼樣?在數組中放置訂單,並在達到限制時彈出它。

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