islice

utilitools.islice(iterable, *args)[source]
Make an iterator that returns selected elements from an iterable.
An extension of itertools.islice that supports negative values for start, stop, and step.
In some cases, negative values require caching; this function minimizes the amount of memory needed.

Caution

Infinite caching can lead to memory issues.
Parameters
  • iterable (collections.Iterable) –

    Iterable to which the slice object will be applied.

  • args (int | None) –

    Arguments to create a slice object:
    • stop

    • start, stop

    • start, stop, step

Returns

An iterator with the selected elements.

Return type

utilitools.islice

Raises
  • TypeError

    • If iterable is not iterable.

    • If args is empty or contains more than three arguments.

    • If args values are not comparable (except NoneType).

  • ValueError

    • If args values are not NoneType or int.

    • If step (from args) is equal to zero.

Examples

from itertools import count
from utilitools import islice

Slicing a finite sequence when start is negative:

>>> iterable = range(50)
>>> iterator = islice(iterable, -15, None, 3)
>>> list(iterator)
[35, 38, 41, 44, 47]

Slicing a finite sequence when start and stop are negative:

>>> iterable = range(50)
>>> iterator = islice(iterable, -30, -20, 3)
>>> list(iterator)
[20, 23, 26, 29]

Slicing a finite sequence when start and step are negative:

>>> iterable = range(50)
>>> iterator = islice(iterable, -30, None, -3)
>>> list(iterator)
[20, 17, 14, 11, 8, 5, 2]

Slicing a finite sequence when start, stop and step are negative:

>>> iterable = range(50)
>>> iterator = islice(iterable, -20, -30, -3)
>>> list(iterator)
[30, 27, 24, 21]

Slicing a finite sequence when stop is negative:

>>> iterable = range(50)
>>> iterator = islice(iterable, None, -30, 3)
>>> list(iterator)
[0, 3, 6, 9, 12, 15, 18]

Slicing a finite sequence when stop and step are negative:

>>> iterable = range(50)
>>> iterator = islice(iterable, None, -20, -3)
>>> list(iterator)
[49, 46, 43, 40, 37, 34, 31]

Slicing an infinite sequence when step is negative:

>>> iterable = count()
>>> iterator = islice(iterable, 30, 20, -3)
>>> list(iterator)
[30, 27, 24, 21]