Шаг 68.
Python: сборник рецептов.
Итераторы и генераторы. Получение среза итератора

    На этом шаге мы рассмотрим использование функции itertools.islice().

Задача

    Вы хотите получить срез данных, производимых итератором, но обычный оператор среза не работает.

Решение

    Функция itertools.islice() отлично подходит для получения срезов генераторов и итераторов. Например:

>>> def count(n):
	while True:
		yield n
		n += 1

		
>>> c = count(0)
>>> c[10:20]
Traceback (most recent call last):
  .   .   .   .
    c[10:20]
TypeError: 'generator' object is not subscriptable
>>> # Теперь используем islice()
>>> import itertools
>>> for x in itertools.islice(c, 10, 20):
	print(x)

	
10
11
12
13
14
15
16
17
18
19
>>>


Обсуждение

    Из итераторов и генераторов получить срез напрямую нельзя, потому что отсутствует информация об их длине (и в них не реализовано индексирование). Результат islice() - это итератор, который создает элементы нужного среза, но делает это путем потребления и выбрасывания всех элементов до стартового индекса среза. Следующие элементы затем производятся объектом islice, пока не будет достигнут конечный индекс среза.

    Важно отметить, что islice() будет потреблять данные, предоставляемые итератором. Это важно, поскольку итераторы не могут быть отмотаны назад. Если вам нужно возвращаться назад, то вам, наверное, лучше сначала конвертировать данные в список.

    На следующем шаге мы рассмотрим пропуск первой части итерируемого объекта.




Предыдущий шаг Содержание Следующий шаг