python - 从 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 特性。
解决方案
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]
推荐阅读
- r - 如何从多个值创建变量
- jekyll - 只渲染一个 Jekyll 集合 - 根本没有其他文件
- oracle - 如何使用一种功能测试我的包?
- apache - Brew 安装 Httpd:欢迎使用 Nginx?
- javascript - 在函数 Tabletop 中使用局部变量
- javascript - 函数声明是非静态的吗?
- javascript - 在 Nuxt 应用程序中用 API 中的数据替换 json 文件中的数据的最简单方法
- database - SwiftUi CloudKit 记录修改无法保存“不允许写入操作”
- npm - 我如何在 package.json 中运行这个 npm 脚本?(同时)而我的客户和服务器文件夹有自己的目录
- scala - 隐式视图不起作用 - 是我隐式定义的错吗?