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):
39 self.inverse[old_value].remove(key)
40 super().__setitem__(key, value)
41 self.inverse.setdefault(value, []).append(key)
43 def __delitem__(self, key):
45 self.inverse.setdefault(value, []).remove(key)
46 if value in self.inverse and not self.inverse[value]:
47 del self.inverse[value]
48 super().__delitem__(key)
51 if __name__ == '__main__':