python - 为什么我要使用 itertools.islice 而不是普通的列表切片?

标签 python list iterator

在我看来,itertools 模块中的许多函数都有更简单的等价物。例如,据我所知,itertools.islice(range(10),2,5)range(10)[2:5] 做同样的事情> 和 itertools.chain([1,2,3],[4,5,6])[1,2,3]+[4,5 ,6]。主要文档页面提到了速度优势,但除此之外还有选择 itertools 的任何理由吗?

最佳答案

针对您提出的两个示例:

import itertools


data1 = range(10)

# This creates a NEW list
data1[2:5]

# This creates an iterator that iterates over the EXISTING list
itertools.islice(data1, 2, 5)


data2 = [1, 2, 3]
data3 = [4, 5, 6]

# This creates a NEW list
data2 + data3

# This creates an iterator that iterates over the EXISTING lists
itertools.chain(data2, data3)

您想要使用迭代器而不是其他方法的原因有很多。如果列表非常大,创建一个包含大子列表的新列表,或者特别是创建一个包含两个其他列表副本的列表,可能会出现问题。使用 islice()chain() 允许您以您想要的方式遍历列表,而无需使用更多内存或计算来创建新的列出。此外,作为 unutbu提到过,您不能对迭代器使用方括号切片或加法。

我希望这已经足够了;还有很多其他答案和其他资源可以解释为什么迭代器很棒,所以我不想在这里重复所有这些信息。

关于python - 为什么我要使用 itertools.islice 而不是普通的列表切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172612/

相关文章:

python - 在 VS Code 中使用路径作为参数值设置自定义启动器(Flask - 证书路径)

python - 可读的尝试除了处理计算

List.empty vs. List() vs. new List()

arrays - Openscad 位于数组或等效数组中

c - 双点列表 C

c++ - 通过map key检查最后插入的项目是否存在

iterator - 如何在 flat_map 中取得一个值的所有权

python - 如何将caffe prototxt转换为pytorch模型?

javascript - DataTables 刷新 Django Ajax 上的 CRUD 操作数据

iterator - 如何从一个范围创建一个 Vec 并对其进行洗牌?