Commit 34e202e6 authored by Raymond Hettinger's avatar Raymond Hettinger

Backport r87672 and r87615, improving tests, using super() instead of direct...

Backport r87672 and r87615, improving tests, using super() instead of direct parent references, and using  __reduce__ method for pickling.
parent 0f88d30b
...@@ -298,16 +298,16 @@ class Counter(dict): ...@@ -298,16 +298,16 @@ class Counter(dict):
or multiset. Elements are stored as dictionary keys and their counts or multiset. Elements are stored as dictionary keys and their counts
are stored as dictionary values. are stored as dictionary values.
>>> c = Counter('abracadabra') # count elements from a string >>> c = Counter('abcdeabcdabcaba') # count elements from a string
>>> c.most_common(3) # three most common elements >>> c.most_common(3) # three most common elements
[('a', 5), ('r', 2), ('b', 2)] [('a', 5), ('b', 4), ('c', 3)]
>>> sorted(c) # list all unique elements >>> sorted(c) # list all unique elements
['a', 'b', 'c', 'd', 'r'] ['a', 'b', 'c', 'd', 'e']
>>> ''.join(sorted(c.elements())) # list elements with repetitions >>> ''.join(sorted(c.elements())) # list elements with repetitions
'aaaaabbcdrr' 'aaaaabbbbcccdde'
>>> sum(c.values()) # total of all counts >>> sum(c.values()) # total of all counts
11 15
>>> c['a'] # count of letter 'a' >>> c['a'] # count of letter 'a'
5 5
...@@ -315,8 +315,8 @@ class Counter(dict): ...@@ -315,8 +315,8 @@ class Counter(dict):
... c[elem] += 1 # by adding 1 to each element's count ... c[elem] += 1 # by adding 1 to each element's count
>>> c['a'] # now there are seven 'a' >>> c['a'] # now there are seven 'a'
7 7
>>> del c['r'] # remove all 'r' >>> del c['b'] # remove all 'b'
>>> c['r'] # now there are zero 'r' >>> c['b'] # now there are zero 'b'
0 0
>>> d = Counter('simsalabim') # make another counter >>> d = Counter('simsalabim') # make another counter
...@@ -355,6 +355,7 @@ class Counter(dict): ...@@ -355,6 +355,7 @@ class Counter(dict):
>>> c = Counter(a=4, b=2) # a new counter from keyword args >>> c = Counter(a=4, b=2) # a new counter from keyword args
''' '''
super().__init__()
self.update(iterable, **kwds) self.update(iterable, **kwds)
def __missing__(self, key): def __missing__(self, key):
...@@ -366,8 +367,8 @@ class Counter(dict): ...@@ -366,8 +367,8 @@ class Counter(dict):
'''List the n most common elements and their counts from the most '''List the n most common elements and their counts from the most
common to the least. If n is None, then list all element counts. common to the least. If n is None, then list all element counts.
>>> Counter('abracadabra').most_common(3) >>> Counter('abcdeabcdabcaba').most_common(3)
[('a', 5), ('r', 2), ('b', 2)] [('a', 5), ('b', 4), ('c', 3)]
''' '''
# Emulate Bag.sortedByCount from Smalltalk # Emulate Bag.sortedByCount from Smalltalk
...@@ -433,7 +434,7 @@ class Counter(dict): ...@@ -433,7 +434,7 @@ class Counter(dict):
for elem, count in iterable.items(): for elem, count in iterable.items():
self[elem] = count + self_get(elem, 0) self[elem] = count + self_get(elem, 0)
else: else:
dict.update(self, iterable) # fast path when counter is empty super().update(iterable) # fast path when counter is empty
else: else:
self_get = self.get self_get = self.get
for elem in iterable: for elem in iterable:
...@@ -445,10 +446,13 @@ class Counter(dict): ...@@ -445,10 +446,13 @@ class Counter(dict):
'Like dict.copy() but returns a Counter instance instead of a dict.' 'Like dict.copy() but returns a Counter instance instead of a dict.'
return Counter(self) return Counter(self)
def __reduce__(self):
return self.__class__, (dict(self),)
def __delitem__(self, elem): def __delitem__(self, elem):
'Like dict.__delitem__() but does not raise KeyError for missing values.' 'Like dict.__delitem__() but does not raise KeyError for missing values.'
if elem in self: if elem in self:
dict.__delitem__(self, elem) super().__delitem__(elem)
def __repr__(self): def __repr__(self):
if not self: if not self:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment