Skip to content

Commit 18d6099

Browse files
London | 26-SDC-Mar | beko | Sprint 2 | implement an LRU cache in python
1 parent e718fb4 commit 18d6099

1 file changed

Lines changed: 61 additions & 0 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from typing import Optional
2+
3+
class _Node:
4+
def __init__(self, key=None, value=None):
5+
self.key = key
6+
self.value = value
7+
self.prev: Optional["_Node"] = None
8+
self.next: Optional["_Node"] = None
9+
10+
class LruCache:
11+
def __init__(self, limit):
12+
if limit <= 0:
13+
raise ValueError("limit must be positive")
14+
15+
self.limit = limit
16+
self.cache = {}
17+
18+
self.head = _Node()
19+
self.tail = _Node()
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+
next_node = self.head.next
29+
assert next_node is not None
30+
31+
node.next = next_node
32+
node.prev = self.head
33+
next_node.prev = node
34+
self.head.next = node
35+
36+
def get(self, key):
37+
if key not in self.cache:
38+
return None
39+
40+
node = self.cache[key]
41+
self.remove(node)
42+
self.add_to_front(node)
43+
return node.value
44+
45+
def set(self, key, value):
46+
if key in self.cache:
47+
node = self.cache[key]
48+
node.value = value
49+
self.remove(node)
50+
self.add_to_front(node)
51+
return
52+
53+
node = _Node(key, value)
54+
self.cache[key] = node
55+
self.add_to_front(node)
56+
57+
if len(self.cache) > self.limit:
58+
lru = self.tail.prev
59+
assert lru is not None
60+
self.remove(lru)
61+
del self.cache[lru.key]

0 commit comments

Comments
 (0)