题目
设计LRU 缓存结构,该结构在构造时确定大小,假设大小为 capacity 有如下功能:
- Solution(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
- get(key):如果关键字 key 存在于缓存中,则返回key对应的value值,否则返回 -1
- set(key, value):将记录(key, value)插入该结构,如果关键字 key 已经存在,则变更其数据值 value,如果不存在,则向缓存中插入该组 key-value ,如果key-value的数量超过capacity,弹出最久未使用的key-value
实现
使用collections.OrderedDict
实现
OrderedDict
是一个有序字典,有序指它记录了每个元素插入的顺序
,适合用来动态增删元素
__init__
:初始化一个空的有序字典,并记录传入的容量值capacityget
:根据key值查字典,若不存在返回-1,若存在则返回值,并把这个键值对删除,重新插入,使得它在字典尾部(表示最近被访问)set
:根据key值查字典
-若存在,将原来的键值对删除,以新的值重新插入
-若不存在,将新的键值对插入字典,检查是否超出容量,超出则删除当前字典中最先插入的元素(表示最久未被访问)
通过OrderedDict.popitem()
实现,它有一个参数last
,指定last=False
时会弹出最先插入的元素,last=True
时会弹出最后插入的元素;本题中使用last=False
代码
from collections import OrderedDict
class Solution:
def __init__(self, capacity):
self.capacity = capacity
self.LRUdict = OrderedDict()
return
def get(self, key):
value = -1
if key in self.LRUdict:
value = self.LRUdict[key]
self.LRUdict.pop(key)
self.LRUdict.update({key: value})
return value
def set(self, key, value):
if key in self.LRUdict:
self.LRUdict.pop(key)
self.LRUdict.update({key: value})
else:
self.LRUdict.update({key: value})
if len(self.LRUdict) > self.capacity:
self.LRUdict.popitem(last=False) # 移除队头元素