merge heads

This commit is contained in:
Benjamin Peterson 2011-08-09 16:16:33 -05:00
commit e451ec393f
4 changed files with 31 additions and 1 deletions
Doc/library
Lib
Misc

View File

@ -264,7 +264,7 @@ Common patterns for working with :class:`Counter` objects::
c.items() # convert to a list of (elem, cnt) pairs c.items() # convert to a list of (elem, cnt) pairs
Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs
c.most_common()[:-n:-1] # n least common elements c.most_common()[:-n:-1] # n least common elements
c += Counter() # remove zero and negative counts +c # remove zero and negative counts
Several mathematical operations are provided for combining :class:`Counter` Several mathematical operations are provided for combining :class:`Counter`
objects to produce multisets (counters that have counts greater than zero). objects to produce multisets (counters that have counts greater than zero).
@ -284,6 +284,18 @@ counts, but the output will exclude results with counts of zero or less.
>>> c | d # union: max(c[x], d[x]) >>> c | d # union: max(c[x], d[x])
Counter({'a': 3, 'b': 2}) Counter({'a': 3, 'b': 2})
Unary addition and substraction are shortcuts for adding an empty counter
or subtracting from an empty counter.
>>> c = Counter(a=2, b=-4)
>>> +c
Counter({'a': 2})
>>> -c
Counter({'b': 4})
.. versionadded:: 3.3
Added support for unary plus and unary minus.
.. note:: .. note::
Counters were primarily designed to work with positive integers to represent Counters were primarily designed to work with positive integers to represent

View File

@ -672,6 +672,17 @@ class Counter(dict):
result[elem] = newcount result[elem] = newcount
return result return result
def __pos__(self):
'Adds an empty counter, effectively stripping negative and zero counts'
return self + Counter()
def __neg__(self):
'''Subtracts from an empty counter. Strips positive and zero counts,
and flips the sign on negative counts.
'''
return Counter() - self
######################################################################## ########################################################################
### ChainMap (helper for configparser and string.Template) ### ChainMap (helper for configparser and string.Template)

View File

@ -943,6 +943,11 @@ class TestCounter(unittest.TestCase):
c.subtract('aaaabbcce') c.subtract('aaaabbcce')
self.assertEqual(c, Counter(a=-1, b=0, c=-1, d=1, e=-1)) self.assertEqual(c, Counter(a=-1, b=0, c=-1, d=1, e=-1))
def test_unary(self):
c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40)
self.assertEqual(dict(+c), dict(c=5, d=10, e=15, g=40))
self.assertEqual(dict(-c), dict(a=5))
def test_helper_function(self): def test_helper_function(self):
# two paths, one for real dicts and one for other mappings # two paths, one for real dicts and one for other mappings
elems = list('abracadabra') elems = list('abracadabra')

View File

@ -254,6 +254,8 @@ Library
- Issue #12540: Prevent zombie IDLE processes on Windows due to changes - Issue #12540: Prevent zombie IDLE processes on Windows due to changes
in os.kill(). in os.kill().
- Add support for unary plus and unary minus to collections.Counter().
- Issue #12683: urlparse updated to include svn as schemes that uses relative - Issue #12683: urlparse updated to include svn as schemes that uses relative
paths. (svn from 1.5 onwards support relative path). paths. (svn from 1.5 onwards support relative path).