diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2018-01-13 19:21:15 (GMT) |
---|---|---|
committer | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2018-01-13 19:21:15 (GMT) |
commit | cf4cd4bccbf7c8931a3c6209457c6f7add4c7b5c (patch) | |
tree | 23a8d17756dc8c4168d5e56e8cf53f5e87cf7940 /Lib/test | |
parent | 29b1aff71805df4c5b6f55c02bda94d07c044c81 (diff) | |
download | cpython-cf4cd4bccbf7c8931a3c6209457c6f7add4c7b5c.zip cpython-cf4cd4bccbf7c8931a3c6209457c6f7add4c7b5c.tar.gz cpython-cf4cd4bccbf7c8931a3c6209457c6f7add4c7b5c.tar.bz2 |
Add itertools recipe for directly finding the n-th combination (GH-5161) (#5174)
(cherry picked from commit d37258dd2e189141906bd234385096cd8e885d8d)
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_itertools.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index a978134..1ad37ae 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -2229,6 +2229,30 @@ Samuele ... # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x ... return next(filter(pred, iterable), default) +>>> def nth_combination(iterable, r, index): +... 'Equivalent to list(combinations(iterable, r))[index]' +... pool = tuple(iterable) +... n = len(pool) +... if r < 0 or r > n: +... raise ValueError +... c = 1 +... k = min(r, n-r) +... for i in range(1, k+1): +... c = c * (n - k + i) // i +... if index < 0: +... index += c +... if index < 0 or index >= c: +... raise IndexError +... result = [] +... while r: +... c, n, r = c*r//n, n-1, r-1 +... while index >= c: +... index -= c +... c, n = c*(n-r)//n, n-1 +... result.append(pool[-1-n]) +... return tuple(result) + + This is not part of the examples but it tests to make sure the definitions perform as purported. @@ -2312,6 +2336,15 @@ True >>> first_true('ABC0DEF1', '9', str.isdigit) '0' +>>> population = 'ABCDEFGH' +>>> for r in range(len(population) + 1): +... seq = list(combinations(population, r)) +... for i in range(len(seq)): +... assert nth_combination(population, r, i) == seq[i] +... for i in range(-len(seq), 0): +... assert nth_combination(population, r, i) == seq[i] + + """ __test__ = {'libreftest' : libreftest} |