Skip to content

Commit aa1cc83

Browse files
committed
implementation Single-Responsibility Principle
1 parent 36b0d96 commit aa1cc83

1 file changed

Lines changed: 41 additions & 31 deletions

File tree

Sprint-2/implement_lru_cache/lru_cache.py

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,10 @@ def __init__(self, key, value):
55
self.next = None
66
self.previous = None
77

8-
class LruCache:
9-
def __init__(self, limit: int):
10-
if limit <= 0:
11-
raise ValueError("limit must be > 0")
12-
8+
class List:
9+
def __init__(self):
1310
self.head = None
1411
self.tail = None
15-
self.limit = limit
16-
self.dict = {}
17-
18-
def set(self, key, value):
19-
node = Node(key, value)
20-
21-
self.dict[key] = node
22-
self.add_to_head(node)
23-
24-
if len(self.dict) > self.limit:
25-
self.evict_tail()
26-
27-
28-
def get(self, key):
29-
node = self.dict.get(key)
30-
31-
if node is None:
32-
return None
33-
else:
34-
self.move_to_head(node)
35-
return node.value
3612

3713
def add_to_head(self, node):
3814
node.previous = None
@@ -64,10 +40,44 @@ def move_to_head(self, node):
6440
self.remove(node)
6541
self.add_to_head(node)
6642

67-
def evict_tail(self):
68-
if self.tail is None:
43+
def pop_tail(self):
44+
if not self.tail:
45+
return None
46+
old_tail=self.tail
47+
self.remove(old_tail)
48+
return old_tail
49+
50+
class LruCache:
51+
def __init__(self, limit: int):
52+
if limit <= 0:
53+
raise ValueError("limit must be > 0")
54+
55+
self.limit = limit
56+
self.cache = {}
57+
self.list = List()
58+
59+
def set(self, key, value):
60+
node = self.cache.get(key)
61+
62+
if node:
63+
node.value=value
64+
self.list.move_to_head(node)
6965
return
66+
67+
node = Node(key, value)
68+
self.cache[key] = node
69+
self.list.add_to_head(node)
7070

71-
old_tail = self.tail
72-
self.remove(old_tail)
73-
del self.dict[old_tail.key]
71+
if len(self.cache) >= self.limit:
72+
tail=self.list.pop_tail()
73+
if tail:
74+
del self.cache[tail.key]
75+
76+
def get(self, key):
77+
node = self.cache.get(key)
78+
79+
if node is None:
80+
return None
81+
else:
82+
self.list.move_to_head(node)
83+
return node.value

0 commit comments

Comments
 (0)