summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2018-01-13 19:21:15 (GMT)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>2018-01-13 19:21:15 (GMT)
commitcf4cd4bccbf7c8931a3c6209457c6f7add4c7b5c (patch)
tree23a8d17756dc8c4168d5e56e8cf53f5e87cf7940 /Lib/test
parent29b1aff71805df4c5b6f55c02bda94d07c044c81 (diff)
downloadcpython-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.py33
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}