Search code examples
pythonslicedeque

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...


Solution

  • 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