Лучший способ напрямую создать подсписок из итератора Python

Легко преобразовать всю последовательность итераторов в список, используя list(iterator) , но каков наилучший / быстрый способ прямого создания подсписка из итератора без предварительного создания всего списка, т. Е. Как лучше всего создать list(iterator)[m:n] без предварительного создания всего списка?

Кажется очевидным, что не должно быть * (по крайней мере, не всегда) возможно сделать это непосредственно при m > 0 , но это должно быть на n меньше, чем длина последовательности. [p for i,p in zip(range(n), iterator)] приходит на ум, но разве это лучший способ?

Контекст прост: создание всего списка приведет к переполнению ОЗУ, поэтому его необходимо разбить. Итак, как вы делаете это эффективно и / или python-ic-ly?


* Упоминание списка, которое я упомянул, очевидно, можно использовать для m > 0 , вызывая next(iterator) m раз перед выполнением, но мне здесь не нравится отсутствие python-ness.

Всего 1 ответ


itertools.islice :

from itertools import islice

itr = (i for i in range(10))
m, n = 3, 8
result = list(islice(itr, m, n))
print(result)
# [3, 4, 5, 6, 7]

Кроме того, вы можете добавить аргумент в качестве step , если вы хотите:

itr = (i for i in range(10))
m, n, step = 3, 8, 2
result = list(islice(itr, m, n, step))
print(result)
# [3, 5, 7]

Есть идеи?

10000