[Python-checkins] cpython (merge default -> default): merge heads

benjamin.peterson python-checkins at python.org
Tue Aug 9 23:17:28 CEST 2011


http://hg.python.org/cpython/rev/bea1e021902e
changeset:   71797:bea1e021902e
parent:      71796:69df5a8d164e
parent:      71790:a5e48ce2f5a3
user:        Benjamin Peterson <benjamin at python.org>
date:        Tue Aug 09 16:16:33 2011 -0500
summary:
  merge heads

files:
  Doc/library/collections.rst  |  14 +++++++++++++-
  Lib/collections/__init__.py  |  11 +++++++++++
  Lib/test/test_collections.py |   5 +++++
  Misc/NEWS                    |   2 ++
  4 files changed, 31 insertions(+), 1 deletions(-)


diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst
--- a/Doc/library/collections.rst
+++ b/Doc/library/collections.rst
@@ -264,7 +264,7 @@
     c.items()                       # convert to 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 += Counter()                  # remove zero and negative counts
+    +c                              # remove zero and negative counts
 
 Several mathematical operations are provided for combining :class:`Counter`
 objects to produce multisets (counters that have counts greater than zero).
@@ -284,6 +284,18 @@
     >>> c | d                       # union:  max(c[x], d[x])
     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::
 
    Counters were primarily designed to work with positive integers to represent
diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py
--- a/Lib/collections/__init__.py
+++ b/Lib/collections/__init__.py
@@ -672,6 +672,17 @@
                 result[elem] = newcount
         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)
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -943,6 +943,11 @@
         c.subtract('aaaabbcce')
         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):
         # two paths, one for real dicts and one for other mappings
         elems = list('abracadabra')
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -254,6 +254,8 @@
 - Issue #12540: Prevent zombie IDLE processes on Windows due to changes
   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
   paths. (svn from 1.5 onwards support relative path).
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list