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