diff options
author | Raymond Hettinger <python@rcn.com> | 2010-04-03 10:32:58 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2010-04-03 10:32:58 (GMT) |
commit | 9c01e441bb2589853446787d4150fe623050a1e1 (patch) | |
tree | fe8479098709faeb7bfd9c7e4b47091c6e0e0212 /Lib/collections.py | |
parent | 03d788dc4d6d399ba1092da5895edd7e6900345a (diff) | |
download | cpython-9c01e441bb2589853446787d4150fe623050a1e1.zip cpython-9c01e441bb2589853446787d4150fe623050a1e1.tar.gz cpython-9c01e441bb2589853446787d4150fe623050a1e1.tar.bz2 |
Add a subtract() method to collections.Counter()
Diffstat (limited to 'Lib/collections.py')
-rw-r--r-- | Lib/collections.py | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/Lib/collections.py b/Lib/collections.py index 6ec062f..53e78f9 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -436,6 +436,34 @@ class Counter(dict): if kwds: self.update(kwds) + def subtract(self, iterable=None, **kwds): + '''Like dict.update() but subtracts counts instead of replacing them. + Counts can be reduced below zero. Both the inputs and outputs are + allowed to contain zero and negative counts. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.subtract('witch') # subtract elements from another iterable + >>> c.subtract(Counter('watch')) # subtract elements from another counter + >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch + 0 + >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch + -1 + + ''' + if iterable is not None: + if isinstance(iterable, Mapping): + self_get = self.get + for elem, count in iterable.items(): + self[elem] = self_get(elem, 0) - count + else: + self_get = self.get + for elem in iterable: + self[elem] = self_get(elem, 0) - 1 + if kwds: + self.subtract(kwds) + def copy(self): 'Like dict.copy() but returns a Counter instance instead of a dict.' return Counter(self) |