web-dev-qa-db-fra.com

Comment regarder devant de deque sans éclater?

Je souhaite vérifier une condition par rapport au début d'une file d'attente avant de décider s'il convient ou non de la faire apparaître. Comment puis-je réaliser cela en python avec collections.deque?

list(my_deque)[0]

semble moche et pauvre pour la performance. 

7
JSStuball

TL; DR: en supposant que votre deque s'appelle d, inspectez simplement d[-1], car l'élément "le plus à droite" d'un deque est l'avant (vous voudrez peut-être tester avant la longueur du deque pour vous assurer qu'il n'est pas vide) . En suivant la suggestion de @asongtoruin, utilisez if d: pour vérifier si le deque est vide (cela équivaut à if len(d) == 0:, mais davantage en Pythonic).

Pourquoi ne pas convertir en liste?

Parce que deques sont indexables et que vous testez front. Alors que deque a une interface similaire à une liste, l'implémentation est optimisée pour les opérations en amont et en aval. Citer la documentation :

Deques supporte les threads-safe, les ajouts et les ajouts efficaces en termes de mémoire. de chaque côté du deque avec approximativement la même performance O(1) dans les deux sens.

Bien que les objets de liste prennent en charge des opérations similaires, ils sont optimisés pour opérations rapides de longueur fixe et encourt O(n) des coûts de mouvement de mémoire pour pop (0) et insert (0, v) les opérations qui changent à la fois la taille et position de la représentation des données sous-jacentes.

La conversion en liste peut être souhaitable si de nombreuses opérations accèdent au "milieu" de la file. Encore une fois en citant la documentation:

L'accès indexé est O(1) aux deux extrémités mais ralentit à O(n) au milieu . Pour un accès aléatoire rapide, utilisez plutôt les listes.

La conversion en list est O (n), mais chaque accès suivant est O (1). 

5
GPhilo

Vous pouvez simplement trouver le dernier élément en utilisant my_deque[-1] ou my_deque[len(my_deque)-1].

0
suraz negi