69 votes

Utiliser la notation de tranche avec collections.deque

Comment extraire les éléments 3..6 de manière efficace, élégante et pythonique des deque sans les altérer :

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

la notation de tranche ne semble pas fonctionner avec deque ...

98voto

Shawn Chin Points 29756
import itertools
output = list(itertools.islice(q, 3, 7))

Par exemple:

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

Cela devrait être plus efficace que les autres solutions publiées jusqu'à présent. Preuve?

 [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

10voto

rm. Points 2237

Je préférerais ça, c'est plus court donc plus facile à lire :

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

3voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X