summaryrefslogtreecommitdiffstats
path: root/Doc/library
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-09-05 05:30:37 (GMT)
committerGitHub <noreply@github.com>2021-09-05 05:30:37 (GMT)
commit656b0bdfaae3a36d386afe3f7b991744528c3ff7 (patch)
treec516a113e6e18dcb9d2a4a17b724c25941e8ee14 /Doc/library
parente5976dd2e6e966183da59df99978ebcb4b3a32df (diff)
downloadcpython-656b0bdfaae3a36d386afe3f7b991744528c3ff7.zip
cpython-656b0bdfaae3a36d386afe3f7b991744528c3ff7.tar.gz
cpython-656b0bdfaae3a36d386afe3f7b991744528c3ff7.tar.bz2
bpo-44571: Add itertool recipe for a variant of takewhile() (GH-28167)
(cherry picked from commit 91be41ad933e24bff26353a19f56447e17fb6367) Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com>
Diffstat (limited to 'Doc/library')
-rw-r--r--Doc/library/itertools.rst29
1 files changed, 28 insertions, 1 deletions
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst
index fd77f99..254e055 100644
--- a/Doc/library/itertools.rst
+++ b/Doc/library/itertools.rst
@@ -837,6 +837,34 @@ which incur interpreter overhead.
t1, t2 = tee(iterable)
return filterfalse(pred, t1), filter(pred, t2)
+ def before_and_after(predicate, it):
+ """ Variant of takewhile() that allows complete
+ access to the remainder of the iterator.
+
+ >>> all_upper, remainder = before_and_after(str.isupper, 'ABCdEfGhI')
+ >>> str.join('', all_upper)
+ 'ABC'
+ >>> str.join('', remainder)
+ 'dEfGhI'
+
+ Note that the first iterator must be fully
+ consumed before the second iterator can
+ generate valid results.
+ """
+ it = iter(it)
+ transition = []
+ def true_iterator():
+ for elem in it:
+ if predicate(elem):
+ yield elem
+ else:
+ transition.append(elem)
+ return
+ def remainder_iterator():
+ yield from transition
+ yield from it
+ return true_iterator(), remainder_iterator()
+
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
@@ -948,4 +976,3 @@ which incur interpreter overhead.
c, n = c*(n-r)//n, n-1
result.append(pool[-1-n])
return tuple(result)
-