11
2- class _Node :
3- def __init__ (self , key = None , value = None ):
4- self .key = key
5- self .value = value
6- self .prev = None
7- self .next = None
2+ from collections import OrderedDict
83
94
105class LruCache :
@@ -13,50 +8,22 @@ def __init__(self, limit):
138 raise ValueError ("limit must be greater than zero" )
149
1510 self .limit = limit
16- self .cache = {}
17- self .head = _Node ()
18- self .tail = _Node ()
19-
20- self .head .next = self .tail
21- self .tail .prev = self .head
22-
23- def _remove (self , node ):
24- node .prev .next = node .next
25- node .next .prev = node .prev
26-
27- def _add_to_front (self , node ):
28- node .prev = self .head
29- node .next = self .head .next
30-
31- self .head .next .prev = node
32- self .head .next = node
33-
34- def _mark_as_used (self , node ):
35- self ._remove (node )
36- self ._add_to_front (node )
11+ self .cache = OrderedDict ()
3712
3813 def get (self , key ):
39- node = self .cache .get (key )
40-
41- if node is None :
14+ if key not in self .cache :
4215 return None
4316
44- self ._mark_as_used ( node )
45- return node . value
17+ self .cache . move_to_end ( key )
18+ return self . cache [ key ]
4619
4720 def set (self , key , value ):
48- node = self .cache .get (key )
49-
50- if node is not None :
51- node .value = value
52- self ._mark_as_used (node )
21+ if key in self .cache :
22+ self .cache [key ] = value
23+ self .cache .move_to_end (key )
5324 return
5425
55- node = _Node (key , value )
56- self .cache [key ] = node
57- self ._add_to_front (node )
26+ self .cache [key ] = value
5827
5928 if len (self .cache ) > self .limit :
60- lru_node = self .tail .prev
61- self ._remove (lru_node )
62- del self .cache [lru_node .key ]
29+ self .cache .popitem (last = False )
0 commit comments