为什么我要使用itertools.islice而不是正常的列表切片?

Luk*_*lor 15 python iterator list

在我看来,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吗?

Cyp*_*ase 22

为了解决你提出的两个例子:

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)
Run Code Online (Sandbox Code Playgroud)

您想要使用迭代器而不是其他方法的原因有很多.如果列表非常大,则创建包含大型子列表的新列表可能会出现问题,或者尤其是创建包含两个其他列表副本的列表.使用islice()chain()允许您以您希望的方式迭代列表,而无需使用更多内存或计算来创建新列表.另外,正如unutbu所提到的,你不能使用括号切片或添加迭代器.

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

  • @veggie1,好吧.. `sum(([1, 2, 3], [4, 5, 6], [7, 8, 9]), [])`。或者,“sum(任意列表的列表,[])”。:D (3认同)

unu*_*tbu 19

itertools.islice可以切片迭代器.索引仅适用于序列.例如,

In [64]: iterator = (x**2 for x in range(10))

In [65]: list(IT.islice(iterator, 2, 5))
Out[65]: [4, 9, 16]

In [66]: iterator[2:5]
TypeError: 'generator' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)

  • 此外,即使对于列表,`islice` 也不会创建新列表,而常规列表切片会。 (2认同)