最近使用面试Python遇到一个问题:
编写一个缓存类,LRUCache,需要满足下列要求:
1、数据存储以key-value形式,
2、可以自定义缓存大小,
3、类里面有get方法,get方法根据key获取value,不存在时返回None
4、类里面有put方法,有两个参数key,value,判断key是否存在,存在,覆盖key的value值,不存在时添加,添加时判断是否大于缓存返回,大于时删除长时间未访问的数据,再进行添加
# @Description : LRU缓存类,可以自定义缓存大小,
from collections import OrderedDict
class LRUCache(OrderedDict):
def __int__(self, capacity: int):
super().__init__()
self.capacity = capacity
def get(self, key: int):
if key not in self:
return None
# 被访问就移动到最后
self.move_to_end(key)
return self[key]
def put(self, key: int, value: int):
if key in self:
self.move_to_end(key)
self[key] = value
if len(self) > self.capacity:
# 当大于最大的缓存范围时,将第一个进行弹出
self.popitem(last=False)
OrderedDict:有序字典
OrderedDict中的popitem(last=False)是移除第一个元素,当放存在的key是使用move_to_end(key)将最近访问的key移动到最后,这样不经常访问的就自然到前面取了,
dict:是无序的,存储时是根据hash进行排序的,所以不是有序的。