From 3e03d32a71372cfc37b1396392c30c3136238dab Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 2 May 2021 19:19:24 -0700 Subject: [PATCH] bpo-25478: Add total() method to collections.Counter --- Doc/library/collections.rst | 12 +++++++++++- Lib/collections/__init__.py | 4 ++++ Lib/test/test_collections.py | 4 ++++ .../Library/2021-05-02-19-17-20.bpo-25478.AwlwdA.rst | 2 ++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2021-05-02-19-17-20.bpo-25478.AwlwdA.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 723c9da7be8d7b..94166ec6c754a7 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -313,6 +313,16 @@ For example:: .. versionadded:: 3.2 + .. method:: total() + + Compute the sum of the counts. + + >>> c = Counter(a=10, b=5, c=0) + >>> c.total() + 15 + + .. versionadded:: 3.10 + The usual dictionary methods are available for :class:`Counter` objects except for two which work differently for counters. @@ -342,7 +352,7 @@ All of those tests treat missing elements as having zero counts so that Common patterns for working with :class:`Counter` objects:: - sum(c.values()) # total of all counts + c.total() # total of all counts c.clear() # reset all counts list(c) # list unique elements set(c) # convert to a set diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 89c73bbf2c10d9..bae0805d6686c5 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -581,6 +581,10 @@ def __missing__(self, key): # Needed so that self[missing_item] does not raise KeyError return 0 + def total(self): + 'Sum of the counts' + return sum(self.values()) + def most_common(self, n=None): '''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. diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 98690d231e606b..b3460a642c5c65 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -2060,6 +2060,10 @@ def test_init(self): self.assertRaises(TypeError, Counter, (), ()) self.assertRaises(TypeError, Counter.__init__) + def test_total(self): + c = Counter(a=10, b=5, c=0) + self.assertEqual(c.total(), 15) + def test_order_preservation(self): # Input order dictates items() order self.assertEqual(list(Counter('abracadabra').items()), diff --git a/Misc/NEWS.d/next/Library/2021-05-02-19-17-20.bpo-25478.AwlwdA.rst b/Misc/NEWS.d/next/Library/2021-05-02-19-17-20.bpo-25478.AwlwdA.rst new file mode 100644 index 00000000000000..81d2724726dd06 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-05-02-19-17-20.bpo-25478.AwlwdA.rst @@ -0,0 +1,2 @@ +Added a *total()* method to collections.Counter() to compute the sum of the +counts.