Why would I want to use itertools.islice instead of normal list slicing?

Question:

It seems to me that many functions in the itertools module have easier equivalents. For example, as far as I can tell, itertools.islice(range(10),2,5) does the same thing as range(10)[2:5], and itertools.chain([1,2,3],[4,5,6]) does the same thing as [1,2,3]+[4,5,6]. The main documentation page mentions speed advantages, but are there any reasons to choose itertools besides this?

Asked By: Luke Taylor

||

Answers:

itertools.islice can slice iterators.
Indexing only works with sequences.
For example,

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__'
Answered By: unutbu

To address the two examples you brought up:

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)

There are many reasons why you’d want to use iterators instead of the other methods. If the lists are very large, it could be a problem to create a new list containing a large sub-list, or especially create a list that has a copy of two other lists. Using islice() or chain() allows you to iterate over the list(s) in the way you want, without having to use more memory or computation to create the new lists. Also, as unutbu mentioned, you can’t use bracket slicing or addition with iterators.

I hope that’s enough of an answer; there are plenty of other answers and other resources explaining why iterators are awesome, so I don’t want to repeat all of that information here.

Answered By: Cyphase

You can do it with vanilla python

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

In [65]: [x for i, x in enumerate(iterator) if i>=2 and i<5]
Out[65]: [4, 9, 16]
Answered By: user9114146
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.