Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enumerate over selected elements from an iterable keeping original indices?

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? :)

like image 330
elegent Avatar asked Dec 19 '22 01:12

elegent


1 Answers

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
like image 158
swenzel Avatar answered Dec 26 '22 11:12

swenzel