Use Trie
class Trie: def __init__(self): self.root = {} def add(self, name, number): # Add name/number to the Trie node = self.root for char in name: if char not in node: node[char] = {} node = node[char] node["Number"] = number def find(self, prefix): # Return node after consuming given prefix node = self.root for char in prefix: if char not in node.keys(): return None node = node[char] return node # Then a hashtable for numbers as key, names as value # Or let Trie has number as children