python - FIFO OrderedDict的问题

查看:214
本文介绍了python - FIFO OrderedDict的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

from collections import OrderedDict
import unittest

class LastUpdatedOrderedDict(OrderedDict):

    def __init__(self, capacity):
        super(LastUpdatedOrderedDict, self).__init__()
        self._capacity = capacity

    def __setitem__(self, key, value):
        containsKey = 1 if key in self else 0
        # print(self)
        if len(self) - containsKey >= self._capacity:
            last = self.popitem(last=False)
            print('remove:', last)
        if containsKey:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        OrderedDict.__setitem__(self, key, value)

问题:

del self[key]  有什么特殊用意么,如果key存在的话,直接让它执行OrderedDict.__setitem__()就行了吧,没必要del再重新self[key] = value吧

ps:这是在别人的代码里看到的,欢迎大家指教。

解决方案

看类的命名,这个类的作用应该是保证最后一次调用时写入的键值对是位于最后的,如果你不del的话,你只是update,打印的时候,键值对是在前面的。

a = LastUpdatedOrderedDict(256)
a[3] = 4  
a[5] = 6
print a # 按照键值对的插入顺序,打印的是LastUpdatedOrderedDict([(3, 4), (5, 6)])
a[3] = 2
print a # 这个时候,又更新了下,以3为key的键值对应该放在后面,打印的是LastUpdatedOrderedDict([(5, 6), (3, 2)])

a是一个实例化的对象,分别插入了3个键值对,见
1) 3 -> 4
2) 5 -> 6
3) 3 -> 2
其中1)和3)的key是相同的,但是value不同,类的意思是谁后写入的数据,排列时候,谁在后面,在完成步骤2)的时候,对象是LastUpdatedOrderedDict([(3, 4), (5, 6)])
在进行步骤3的时候,因为你这个是个有序的字典,并且要后插入的键值对位于后面,期望获得的结果是LastUpdatedOrderedDict([(5, 6), (3, 2)])。
如果你这里不del key,在__setitem__的时候,只会更新原来的数组,结果为
LastUpdatedOrderedDict([(3, 2), (5, 6)])
所以需要del下key,打乱之前的结构,再进行键值对的插入。

这篇关于python - FIFO OrderedDict的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆