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