从 python 迭代器直接生成子列表的最佳方法
Best way to directly generate a sublist from a python iterator
It is easy to convert an entire iterator sequence into a list 使用 list(iterator)
,但是 best/fastest 直接从迭代器创建子列表而不首先创建整个列表的方法是什么,即如何最好地创建 list(iterator)[m:n]
没有先创建整个列表?
显然不应该*(至少不总是)可以直接为 m > 0
这样做,但对于 n
应该小于序列的长度。 [p for i,p in zip(range(n), iterator)]
想到了,但这是最好的方法吗?
上下文很简单:创建整个列表会导致 RAM 溢出,因此需要对其进行分解。那么如何有效地做到这一点 and/or python-ic-ly?
*我提到的列表理解显然可以通过在执行前调用 next(iterator)
m
次来用于 m > 0
,但我不喜欢缺少 python-在这里。
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]
It is easy to convert an entire iterator sequence into a list 使用 list(iterator)
,但是 best/fastest 直接从迭代器创建子列表而不首先创建整个列表的方法是什么,即如何最好地创建 list(iterator)[m:n]
没有先创建整个列表?
显然不应该*(至少不总是)可以直接为 m > 0
这样做,但对于 n
应该小于序列的长度。 [p for i,p in zip(range(n), iterator)]
想到了,但这是最好的方法吗?
上下文很简单:创建整个列表会导致 RAM 溢出,因此需要对其进行分解。那么如何有效地做到这一点 and/or python-ic-ly?
*我提到的列表理解显然可以通过在执行前调用 next(iterator)
m
次来用于 m > 0
,但我不喜欢缺少 python-在这里。
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]