I run into the case of using an enumerator on selected elements form an iterable (i.e. a sequence or an iterator or similar) and want that the original indices were being returned instead of the default count
, starting by 0
and going up to len(iterable) - 1
.
A very naive approach would be the declaration of a new generator object called _enumerate()
>>> def _enumerate(iterable, offset = 0, step = 1):
index = offset
for element in iterable:
yield index, element
index += step
... a new list object months
.
>>> months = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"]
Using Pythons build-in enumerate
function would yield this output for a [5::2]
slice:
>>> for index, element in enumerate(months[5::2]):
print(index, element)
0 June
1 August
2 October
3 December
The expected output of our own enumerator _enumerate
again for a [5::2]
slice:
>>> for index, element in _enumerate(months[5::2], offset = 5, step = 2):
print(index, element)
5 June
7 August
9 October
11 December
Do you know any better, more pythonic and more readable solutions? :)
Here my comment as an answer ;)
months = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"]
offset = 5
step = 2
for index, element in enumerate(months[offset::step]):
# recalculate original index
index = offset + index*step
# actually repetition of the month is trivial,
# but I put it just to show that the index is right
print(index, element, months[index])
Prints:
5 June June
7 August August
9 October October
11 December December