import copy class Node: def __init__(self, key, value): self.key = key self.value = value self.next = None class HashTable: def __init__(self): self.capacity = 2 self.noOfElements = 0 self.elementList = [None] * 2 def hash(self, value): if isinstance(value, int): return value % self.capacity sum = 0 for l in value: sum += ord(l) return sum % self.capacity def insert(self, key, value): if self.noOfElements and (self.capacity // self.noOfElements < 2): self.resizeAndRehash() hash_key = self.hash(key) element = self.elementList[hash_key] if element is None: self.elementList[hash_key] = Node(key, value) self.noOfElements += 1 return while element.next is not None: element = element.next element.next = Node(key, value) self.noOfElements += 1 def get(self, key): element = self.elementList[self.hash(key)] while element is not None: if element.key == key: return element.value element = element.next return None def getPosition(self, key): element = self.elementList[self.hash(key)] position = 0 while element is not None: if element.key == key: return (key,position) element = element.next position += 1 return None def resizeAndRehash(self): self.capacity *= 2 copyElementList = copy.deepcopy(self.elementList) self.elementList = [None] * self.capacity self.noOfElements = 0 for element in copyElementList: copyElement = copy.deepcopy(element) while copyElement is not None: self.insert(copyElement.key, copyElement.value) copyElement = copyElement.next def __str__(self): var = "" for element in self.elementList: while element is not None: var += f"{element.key} -> {element.value}\n" element = element.next return var