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 = None, sub_title: str = None): self.data.append(text) if (title is not None) and (sub_title is not None): self.index_list.append((id, WeakValueDictionary({'title': StringWrapper(title), 'sub_title': StringWrapper(sub_title)}))) elif (title is not None) and (sub_title is None): self.index_list.append((id, WeakValueDictionary({'title': StringWrapper(title)}))) else: self.index_list.append(id) 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