mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Finish-up docs for combinations() and permutations() in itertools.
This commit is contained in:
parent
47dff40a40
commit
f287f17779
1 changed files with 30 additions and 10 deletions
|
@ -104,26 +104,24 @@ loops that truncate the stream.
|
||||||
Each result tuple is ordered to match the input order. So, every
|
Each result tuple is ordered to match the input order. So, every
|
||||||
combination is a subsequence of the input *iterable*.
|
combination is a subsequence of the input *iterable*.
|
||||||
|
|
||||||
Example: ``combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)``
|
|
||||||
|
|
||||||
Equivalent to::
|
Equivalent to::
|
||||||
|
|
||||||
def combinations(iterable, r):
|
def combinations(iterable, r):
|
||||||
|
'combinations(range(4), 3) --> (0,1,2) (0,1,3) (0,2,3) (1,2,3)'
|
||||||
pool = tuple(iterable)
|
pool = tuple(iterable)
|
||||||
n = len(pool)
|
n = len(pool)
|
||||||
assert 0 <= r <= n
|
indices = range(r)
|
||||||
vec = range(r)
|
yield tuple(pool[i] for i in indices)
|
||||||
yield tuple(pool[i] for i in vec)
|
|
||||||
while 1:
|
while 1:
|
||||||
for i in reversed(range(r)):
|
for i in reversed(range(r)):
|
||||||
if vec[i] != i + n - r:
|
if indices[i] != i + n - r:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
vec[i] += 1
|
indices[i] += 1
|
||||||
for j in range(i+1, r):
|
for j in range(i+1, r):
|
||||||
vec[j] = vec[j-1] + 1
|
indices[j] = indices[j-1] + 1
|
||||||
yield tuple(pool[i] for i in vec)
|
yield tuple(pool[i] for i in indices)
|
||||||
|
|
||||||
.. versionadded:: 2.6
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
|
@ -369,7 +367,29 @@ loops that truncate the stream.
|
||||||
value. So if the input elements are unique, there will be no repeat
|
value. So if the input elements are unique, there will be no repeat
|
||||||
values in each permutation.
|
values in each permutation.
|
||||||
|
|
||||||
Example: ``permutations(range(3),2) --> (1,2) (1,3) (2,1) (2,3) (3,1) (3,2)``
|
Equivalent to::
|
||||||
|
|
||||||
|
def permutations(iterable, r=None):
|
||||||
|
'permutations(range(3), 2) --> (0,1) (0,2) (1,0) (1,2) (2,0) (2,1)'
|
||||||
|
pool = tuple(iterable)
|
||||||
|
n = len(pool)
|
||||||
|
r = n if r is None else r
|
||||||
|
indices = range(n)
|
||||||
|
cycles = range(n-r+1, n+1)[::-1]
|
||||||
|
yield tuple(pool[i] for i in indices[:r])
|
||||||
|
while n:
|
||||||
|
for i in reversed(range(r)):
|
||||||
|
cycles[i] -= 1
|
||||||
|
if cycles[i] == 0:
|
||||||
|
indices[:] = indices[:i] + indices[i+1:] + indices[i:i+1]
|
||||||
|
cycles[i] = n - i
|
||||||
|
else:
|
||||||
|
j = cycles[i]
|
||||||
|
indices[i], indices[-j] = indices[-j], indices[i]
|
||||||
|
yield tuple(pool[i] for i in indices[:r])
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
.. versionadded:: 2.6
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue