bpo-36057 Update docs and tests for ordering in collections.Counter [no behavior change] by rhettinger · Pull Request #11962 · python/cpython
Expand Up
@@ -1867,6 +1867,63 @@ def test_init(self):
self.assertRaises(TypeError, Counter, (), ())
self.assertRaises(TypeError, Counter.__init__)
def test_order_preservation(self): # Input order dictates items() order self.assertEqual(list(Counter('abracadabra').items()), [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)]) # letters with same count: ^----------^ ^---------^
# Verify retention of order even when all counts are equal self.assertEqual(list(Counter('xyzpdqqdpzyx').items()), [('x', 2), ('y', 2), ('z', 2), ('p', 2), ('d', 2), ('q', 2)])
# Input order dictates elements() order self.assertEqual(list(Counter('abracadabra simsalabim').elements()), ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b','r', 'r', 'c', 'd', ' ', 's', 's', 'i', 'i', 'm', 'm', 'l'])
# Math operations order first by the order encountered in the left # operand and then by the order encounted in the right operand. ps = 'aaabbcdddeefggghhijjjkkl' qs = 'abbcccdeefffhkkllllmmnno' order = {letter: i for i, letter in enumerate(dict.fromkeys(ps + qs))} def correctly_ordered(seq): 'Return true if the letters occur in the expected order' positions = [order[letter] for letter in seq] return positions == sorted(positions)
p, q = Counter(ps), Counter(qs) self.assertTrue(correctly_ordered(+p)) self.assertTrue(correctly_ordered(-p)) self.assertTrue(correctly_ordered(p + q)) self.assertTrue(correctly_ordered(p - q)) self.assertTrue(correctly_ordered(p | q)) self.assertTrue(correctly_ordered(p & q))
p, q = Counter(ps), Counter(qs) p += q self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p -= q self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p |= q self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p &= q self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p.update(q) self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p.subtract(q) self.assertTrue(correctly_ordered(p))
def test_update(self): c = Counter() c.update(self=42) Expand Down
def test_order_preservation(self): # Input order dictates items() order self.assertEqual(list(Counter('abracadabra').items()), [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)]) # letters with same count: ^----------^ ^---------^
# Verify retention of order even when all counts are equal self.assertEqual(list(Counter('xyzpdqqdpzyx').items()), [('x', 2), ('y', 2), ('z', 2), ('p', 2), ('d', 2), ('q', 2)])
# Input order dictates elements() order self.assertEqual(list(Counter('abracadabra simsalabim').elements()), ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b','r', 'r', 'c', 'd', ' ', 's', 's', 'i', 'i', 'm', 'm', 'l'])
# Math operations order first by the order encountered in the left # operand and then by the order encounted in the right operand. ps = 'aaabbcdddeefggghhijjjkkl' qs = 'abbcccdeefffhkkllllmmnno' order = {letter: i for i, letter in enumerate(dict.fromkeys(ps + qs))} def correctly_ordered(seq): 'Return true if the letters occur in the expected order' positions = [order[letter] for letter in seq] return positions == sorted(positions)
p, q = Counter(ps), Counter(qs) self.assertTrue(correctly_ordered(+p)) self.assertTrue(correctly_ordered(-p)) self.assertTrue(correctly_ordered(p + q)) self.assertTrue(correctly_ordered(p - q)) self.assertTrue(correctly_ordered(p | q)) self.assertTrue(correctly_ordered(p & q))
p, q = Counter(ps), Counter(qs) p += q self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p -= q self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p |= q self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p &= q self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p.update(q) self.assertTrue(correctly_ordered(p))
p, q = Counter(ps), Counter(qs) p.subtract(q) self.assertTrue(correctly_ordered(p))
def test_update(self): c = Counter() c.update(self=42) Expand Down