From 28aa4a06842bb4a27b6c41b61bc52da74cad669e Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 7 Sep 2016 00:08:44 -0700 Subject: Rename weighted_choices() to just choices() --- Doc/library/random.rst | 2 +- Lib/random.py | 6 +++--- Lib/test/test_random.py | 54 ++++++++++++++++++++++++------------------------- Misc/NEWS | 2 +- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 330cce1..5eb44da 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -124,7 +124,7 @@ Functions for sequences: Return a random element from the non-empty sequence *seq*. If *seq* is empty, raises :exc:`IndexError`. -.. function:: weighted_choices(k, population, weights=None, *, cum_weights=None) +.. function:: choices(k, population, weights=None, *, cum_weights=None) Return a *k* sized list of elements chosen from the *population* with replacement. If the *population* is empty, raises :exc:`IndexError`. diff --git a/Lib/random.py b/Lib/random.py index 136395e..cd8583f 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -51,7 +51,7 @@ __all__ = ["Random","seed","random","uniform","randint","choice","sample", "randrange","shuffle","normalvariate","lognormvariate", "expovariate","vonmisesvariate","gammavariate","triangular", "gauss","betavariate","paretovariate","weibullvariate", - "getstate","setstate", "getrandbits", "weighted_choices", + "getstate","setstate", "getrandbits", "choices", "SystemRandom"] NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) @@ -337,7 +337,7 @@ class Random(_random.Random): result[i] = population[j] return result - def weighted_choices(self, k, population, weights=None, *, cum_weights=None): + def choices(self, k, population, weights=None, *, cum_weights=None): """Return a k sized list of population elements chosen with replacement. If the relative weights or cumulative weights are not specified, @@ -749,7 +749,7 @@ choice = _inst.choice randrange = _inst.randrange sample = _inst.sample shuffle = _inst.shuffle -weighted_choices = _inst.weighted_choices +choices = _inst.choices normalvariate = _inst.normalvariate lognormvariate = _inst.lognormvariate expovariate = _inst.expovariate diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index b3741a8..9c1383d 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -142,8 +142,8 @@ class TestBasicOps: def test_sample_on_dicts(self): self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2) - def test_weighted_choices(self): - weighted_choices = self.gen.weighted_choices + def test_choices(self): + choices = self.gen.choices data = ['red', 'green', 'blue', 'yellow'] str_data = 'abcd' range_data = range(4) @@ -151,63 +151,63 @@ class TestBasicOps: # basic functionality for sample in [ - weighted_choices(5, data), - weighted_choices(5, data, range(4)), - weighted_choices(k=5, population=data, weights=range(4)), - weighted_choices(k=5, population=data, cum_weights=range(4)), + choices(5, data), + choices(5, data, range(4)), + choices(k=5, population=data, weights=range(4)), + choices(k=5, population=data, cum_weights=range(4)), ]: self.assertEqual(len(sample), 5) self.assertEqual(type(sample), list) self.assertTrue(set(sample) <= set(data)) # test argument handling - with self.assertRaises(TypeError): # missing arguments - weighted_choices(2) + with self.assertRaises(TypeError): # missing arguments + choices(2) - self.assertEqual(weighted_choices(0, data), []) # k == 0 - self.assertEqual(weighted_choices(-1, data), []) # negative k behaves like ``[0] * -1`` + self.assertEqual(choices(0, data), []) # k == 0 + self.assertEqual(choices(-1, data), []) # negative k behaves like ``[0] * -1`` with self.assertRaises(TypeError): - weighted_choices(2.5, data) # k is a float + choices(2.5, data) # k is a float - self.assertTrue(set(weighted_choices(5, str_data)) <= set(str_data)) # population is a string sequence - self.assertTrue(set(weighted_choices(5, range_data)) <= set(range_data)) # population is a range + self.assertTrue(set(choices(5, str_data)) <= set(str_data)) # population is a string sequence + self.assertTrue(set(choices(5, range_data)) <= set(range_data)) # population is a range with self.assertRaises(TypeError): - weighted_choices(2.5, set_data) # population is not a sequence + choices(2.5, set_data) # population is not a sequence - self.assertTrue(set(weighted_choices(5, data, None)) <= set(data)) # weights is None - self.assertTrue(set(weighted_choices(5, data, weights=None)) <= set(data)) + self.assertTrue(set(choices(5, data, None)) <= set(data)) # weights is None + self.assertTrue(set(choices(5, data, weights=None)) <= set(data)) with self.assertRaises(ValueError): - weighted_choices(5, data, [1,2]) # len(weights) != len(population) + choices(5, data, [1,2]) # len(weights) != len(population) with self.assertRaises(IndexError): - weighted_choices(5, data, [0]*4) # weights sum to zero + choices(5, data, [0]*4) # weights sum to zero with self.assertRaises(TypeError): - weighted_choices(5, data, 10) # non-iterable weights + choices(5, data, 10) # non-iterable weights with self.assertRaises(TypeError): - weighted_choices(5, data, [None]*4) # non-numeric weights + choices(5, data, [None]*4) # non-numeric weights for weights in [ [15, 10, 25, 30], # integer weights [15.1, 10.2, 25.2, 30.3], # float weights [Fraction(1, 3), Fraction(2, 6), Fraction(3, 6), Fraction(4, 6)], # fractional weights [True, False, True, False] # booleans (include / exclude) ]: - self.assertTrue(set(weighted_choices(5, data, weights)) <= set(data)) + self.assertTrue(set(choices(5, data, weights)) <= set(data)) with self.assertRaises(ValueError): - weighted_choices(5, data, cum_weights=[1,2]) # len(weights) != len(population) + choices(5, data, cum_weights=[1,2]) # len(weights) != len(population) with self.assertRaises(IndexError): - weighted_choices(5, data, cum_weights=[0]*4) # cum_weights sum to zero + choices(5, data, cum_weights=[0]*4) # cum_weights sum to zero with self.assertRaises(TypeError): - weighted_choices(5, data, cum_weights=10) # non-iterable cum_weights + choices(5, data, cum_weights=10) # non-iterable cum_weights with self.assertRaises(TypeError): - weighted_choices(5, data, cum_weights=[None]*4) # non-numeric cum_weights + choices(5, data, cum_weights=[None]*4) # non-numeric cum_weights with self.assertRaises(TypeError): - weighted_choices(5, data, range(4), cum_weights=range(4)) # both weights and cum_weights + choices(5, data, range(4), cum_weights=range(4)) # both weights and cum_weights for weights in [ [15, 10, 25, 30], # integer cum_weights [15.1, 10.2, 25.2, 30.3], # float cum_weights [Fraction(1, 3), Fraction(2, 6), Fraction(3, 6), Fraction(4, 6)], # fractional cum_weights ]: - self.assertTrue(set(weighted_choices(5, data, cum_weights=weights)) <= set(data)) + self.assertTrue(set(choices(5, data, cum_weights=weights)) <= set(data)) def test_gauss(self): # Ensure that the seed() method initializes all the hidden state. In diff --git a/Misc/NEWS b/Misc/NEWS index 002e4be..9da1757 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -101,7 +101,7 @@ Library - Issue #27691: Fix ssl module's parsing of GEN_RID subject alternative name fields in X.509 certs. -- Issue #18844: Add random.weighted_choices(). +- Issue #18844: Add random.choices(). - Issue #25761: Improved error reporting about truncated pickle data in C implementation of unpickler. UnpicklingError is now raised instead of -- cgit v0.12