diff options
| author | Scott Gasch <[email protected]> | 2021-09-29 11:21:41 -0700 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2021-09-29 11:21:41 -0700 |
| commit | b2eed6fefcfa14b03916c145ad3c0435b25374d0 (patch) | |
| tree | 8b416bff7c0768c8b84969e5867dee398307b112 /collect | |
| parent | d82c8377ce394cad812dc0d53829f7465b3f3f4e (diff) | |
Add tests on bidict. Fix bug in string_utils ngrams.
Diffstat (limited to 'collect')
| -rw-r--r-- | collect/bidict.py | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/collect/bidict.py b/collect/bidict.py index 5ba3fc3..e162179 100644 --- a/collect/bidict.py +++ b/collect/bidict.py @@ -2,7 +2,33 @@ class bidict(dict): def __init__(self, *args, **kwargs): - super(bidict, self).__init__(*args, **kwargs) + """ + A class that stores both a Mapping between keys and values and + also the inverse mapping between values and their keys to + allow for efficient lookups in either direction. Because it + is possible to have several keys with the same value, using + the inverse map returns a sequence of keys. + + >>> d = bidict() + >>> d['a'] = 1 + >>> d['b'] = 2 + >>> d['c'] = 2 + >>> d['a'] + 1 + >>> d.inverse[1] + ['a'] + >>> d.inverse[2] + ['b', 'c'] + >>> len(d) + 3 + >>> del d['c'] + >>> len(d) + 2 + >>> d.inverse[2] + ['b'] + + """ + super().__init__(*args, **kwargs) self.inverse = {} for key, value in self.items(): self.inverse.setdefault(value, []).append(key) @@ -10,11 +36,16 @@ class bidict(dict): def __setitem__(self, key, value): if key in self: self.inverse[self[key]].remove(key) - super(bidict, self).__setitem__(key, value) + super().__setitem__(key, value) self.inverse.setdefault(value, []).append(key) def __delitem__(self, key): self.inverse.setdefault(self[key], []).remove(key) if self[key] in self.inverse and not self.inverse[self[key]]: del self.inverse[self[key]] - super(bidict, self).__delitem__(key) + super().__delitem__(key) + + +if __name__ == '__main__': + import doctest + doctest.testmod() |
