From: Raymond Hettinger Date: Fri, 15 Apr 2011 20:21:30 +0000 (-0700) Subject: Fix minor subclassing issue with collections.Counter X-Git-Tag: v3.2.1b1~120 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c9e5b779f4cbb16f529f0451a07eaa57caad896;p=python Fix minor subclassing issue with collections.Counter --- 6c9e5b779f4cbb16f529f0451a07eaa57caad896 diff --cc Lib/collections.py index 98c4325753,30301ce89f..c77b08972c --- a/Lib/collections.py +++ b/Lib/collections.py @@@ -508,36 -458,9 +508,36 @@@ 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: + self_get = self.get + if isinstance(iterable, Mapping): + for elem, count in iterable.items(): + self[elem] = self_get(elem, 0) - count + else: + 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) + 'Return a shallow copy.' + return self.__class__(self) def __reduce__(self): return self.__class__, (dict(self),)