Skip to content

Commit

Permalink
Minor clarity improvement for the iter_index() recipe. Also add value…
Browse files Browse the repository at this point in the history
… subsequence tests. (pythongh-116696)
  • Loading branch information
rhettinger committed Mar 13, 2024
1 parent bf121d6 commit 93a687a
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions Doc/library/itertools.rst
Original file line number Diff line number Diff line change
Expand Up @@ -902,18 +902,19 @@ which incur interpreter overhead.
# iter_index('AABCADEAF', 'A') --> 0 1 4 7
seq_index = getattr(iterable, 'index', None)
if seq_index is None:
# Slow path for general iterables
# Path for general iterables
it = islice(iterable, start, stop)
for i, element in enumerate(it, start):
if element is value or element == value:
yield i
else:
# Fast path for sequences
# Path for sequences with an index() method
stop = len(iterable) if stop is None else stop
i = start - 1
i = start
try:
while True:
yield (i := seq_index(value, i+1, stop))
yield (i := seq_index(value, i, stop))
i += 1
except ValueError:
pass

Expand Down Expand Up @@ -1412,6 +1413,22 @@ The following recipes have a more mathematical flavor:
>>> ''.join(input_iterator)
'DEAF'

>>> # Verify that the target value can be a sequence.
>>> seq = [[10, 20], [30, 40], 30, 40, [30, 40], 50]
>>> target = [30, 40]
>>> list(iter_index(seq, target))
[1, 4]

>>> # Verify faithfulness to type specific index() method behaviors.
>>> # For example, bytes and str perform subsequence searches
>>> # that do not match the general behavior specified
>>> # in collections.abc.Sequence.index().
>>> seq = 'abracadabra'
>>> target = 'ab'
>>> list(iter_index(seq, target))
[0, 7]


>>> list(sieve(30))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
>>> small_primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
Expand Down

0 comments on commit 93a687a

Please sign in to comment.