Jonathan - 1 month ago 15
Python Question

# Use slice notation with collections.deque

How would you extract items 3..6 efficiently, elegantly and pythonically from the following

`deque`
without altering it:

``````from collections import deque
q = deque('',maxlen=10)
for i in range(10,20):
q.append(i)
``````

the slice notation doesn't seem to work with
`deque`
...

Answer
``````import itertools
output = list(itertools.islice(q, 3, 7))
``````

For example:

``````>>> import collections, itertools
>>> q = collections.deque(xrange(10, 20))
>>> q
deque([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> list(itertools.islice(q, 3, 7))
[13, 14, 15, 16]
``````

This should be more efficient the the other solutions posted so far. Proof?

``````[me@home]\$ SETUP="import itertools,collections; q=collections.deque(xrange(1000000))"

[me@home]\$ python -m timeit  "\$SETUP" "list(itertools.islice(q, 10000, 20000))"
10 loops, best of 3: 68 msec per loop

[me@home]\$ python -m timeit "\$SETUP" "[q[i] for i in  xrange(10000, 20000)]"
10 loops, best of 3: 98.4 msec per loop

[me@home]\$ python -m timeit "\$SETUP" "list(q)[10000:20000]"
10 loops, best of 3: 107 msec per loop
``````
Source (Stackoverflow)
Comments