4 def __init__(self, *args, **kwargs):
6 A class that stores both a Mapping between keys and values and
7 also the inverse mapping between values and their keys to
8 allow for efficient lookups in either direction. Because it
9 is possible to have several keys with the same value, using
10 the inverse map returns a sequence of keys.
31 super().__init__(*args, **kwargs)
33 for key, value in self.items():
34 self.inverse.setdefault(value, []).append(key)
36 def __setitem__(self, key, value):
38 self.inverse[self[key]].remove(key)
39 super().__setitem__(key, value)
40 self.inverse.setdefault(value, []).append(key)
42 def __delitem__(self, key):
43 self.inverse.setdefault(self[key], []).remove(key)
44 if self[key] in self.inverse and not self.inverse[self[key]]:
45 del self.inverse[self[key]]
46 super().__delitem__(key)
49 if __name__ == '__main__':