Лучший способ напрямую создать подсписок из итератора python - PullRequest
0 голосов
/ 16 января 2020

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

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

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


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

1 Ответ

1 голос
/ 16 января 2020

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]
...