from weakref import WeakValueDictionary from collections import defaultdict class StringWrapper: def __init__(self, s): self.s = s class OrderedMultiIndexMapWeakRef: def __init__(self): self.data = [] self.index_list = [] def insert(self, id, text, title: str, sub_title: str): self.data.append(text) self.index_list.append((id, WeakValueDictionary({'title': StringWrapper(title), 'sub_title': StringWrapper(sub_title)}))) def get(self, key): if key: return [self.data[i][1] for i in self.index_map[key]] else: return [self.data[i][1] for i in self.keyless_values] def all_titles(self): return self.index_list def all_texts(self): return self.data