首页 > 解决方案 > 从 python 迭代器直接生成子列表的最佳方法

问题描述

使用将整个迭代器序列转换为列表很容易list(iterator),但是在不首先创建整个列表的情况下直接从迭代器创建子列表的最佳/最快方法是什么,即如何在list(iterator)[m:n]不首先创建整个列表的情况下最好地创建?

很明显,它不应该*(至少不总是)可以直接为 这样做m > 0,但它应该n小于序列的长度。[p for i,p in zip(range(n), iterator)]想到了,但这是最好的方法吗?

上下文很简单:创建整个列表会导致 RAM 溢出,因此需要对其进行分解。那么你如何有效地和/或 python-ic-ly 做到这一点?


*我提到的列表理解显然可以m > 0通过在执行前调用next(iterator) m时间来使用,但我不喜欢这里缺乏 python 特性。

标签: pythonperformanceiteratorsublist

解决方案


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]

推荐阅读