ordereddict ordered example chainmap python slice deque

python - ordered - Utilice la notación de sectores con collections.deque



python 3.6 deque (4)

Cómo extraería los elementos 3..6 de manera eficiente, elegante y pitónicamente del siguiente deque sin alterarlo:

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

la notación de división no parece funcionar con deque ...


Agregaría esto como una nueva respuesta, para proporcionar un mejor formato.

Para simplificar, la respuesta de Shawn es perfecta, pero si a menudo necesitas obtener un corte de la dequeue , podrías preferir subclasificarlo y agregar un método __getslice__ .

from collections import deque from itertools import islice class deque_slice(deque): def __new__(cls, *args): return deque.__new__(cls, *args) def __getslice__(self, start, end): return list(islice(self, start, end))

Esto no admitirá establecer un nuevo segmento, pero puede implementar su propio método __setslice__ personalizado utilizando el mismo concepto.


Yo preferiría esto, es más corto y más fácil de leer:

output = list(q)[3:6+1]


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

Por ejemplo:

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

Esto debería ser más eficiente que las otras soluciones publicadas hasta el momento. ¿Prueba?

[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


output = [q[i] for i in range(3,6+1)]