diff options
author | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2022-10-17 22:30:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-17 22:30:49 (GMT) |
commit | 70732d8a4c98cdf3cc9efa5241ce33fb9bc323ca (patch) | |
tree | 692066a619edb0bff511dd3491435ba349da299b | |
parent | 5fe043147493e33f2af6ab74610735130add1fe9 (diff) | |
download | cpython-70732d8a4c98cdf3cc9efa5241ce33fb9bc323ca.zip cpython-70732d8a4c98cdf3cc9efa5241ce33fb9bc323ca.tar.gz cpython-70732d8a4c98cdf3cc9efa5241ce33fb9bc323ca.tar.bz2 |
Move random selection recipes from itertools.rst to random.rst (GH-98369)
-rw-r--r-- | Doc/library/itertools.rst | 25 | ||||
-rw-r--r-- | Doc/library/random.rst | 31 |
2 files changed, 31 insertions, 25 deletions
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 88e1e5a..9f7ec10 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -1000,31 +1000,6 @@ which incur interpreter overhead. # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x return next(filter(pred, iterable), default) - def random_product(*args, repeat=1): - "Random selection from itertools.product(*args, **kwds)" - pools = [tuple(pool) for pool in args] * repeat - return tuple(map(random.choice, pools)) - - def random_permutation(iterable, r=None): - "Random selection from itertools.permutations(iterable, r)" - pool = tuple(iterable) - r = len(pool) if r is None else r - return tuple(random.sample(pool, r)) - - def random_combination(iterable, r): - "Random selection from itertools.combinations(iterable, r)" - pool = tuple(iterable) - n = len(pool) - indices = sorted(random.sample(range(n), r)) - return tuple(pool[i] for i in indices) - - def random_combination_with_replacement(iterable, r): - "Random selection from itertools.combinations_with_replacement(iterable, r)" - pool = tuple(iterable) - n = len(pool) - indices = sorted(random.choices(range(n), k=r)) - return tuple(pool[i] for i in indices) - def nth_combination(iterable, r, index): "Equivalent to list(combinations(iterable, r))[index]" pool = tuple(iterable) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 7e527a9..669204b 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -582,6 +582,37 @@ Simulation of arrival times and service deliveries for a multiserver queue:: Recipes ------- +These recipes show how to efficiently make random selections +from the combinatoric iterators in the :mod:`itertools` module: + +.. testcode:: + import random + + def random_product(*args, repeat=1): + "Random selection from itertools.product(*args, **kwds)" + pools = [tuple(pool) for pool in args] * repeat + return tuple(map(random.choice, pools)) + + def random_permutation(iterable, r=None): + "Random selection from itertools.permutations(iterable, r)" + pool = tuple(iterable) + r = len(pool) if r is None else r + return tuple(random.sample(pool, r)) + + def random_combination(iterable, r): + "Random selection from itertools.combinations(iterable, r)" + pool = tuple(iterable) + n = len(pool) + indices = sorted(random.sample(range(n), r)) + return tuple(pool[i] for i in indices) + + def random_combination_with_replacement(iterable, r): + "Random selection from itertools.combinations_with_replacement(iterable, r)" + pool = tuple(iterable) + n = len(pool) + indices = sorted(random.choices(range(n), k=r)) + return tuple(pool[i] for i in indices) + The default :func:`.random` returns multiples of 2⁻⁵³ in the range *0.0 ≤ x < 1.0*. All such numbers are evenly spaced and are exactly representable as Python floats. However, many other representable |