
Au-delà des listes : utiliser Python Deque pour les fenêtres coulissantes en temps réel
ou simplement dequeest un type de collection peu courant. Si nous effectuons une recherche sur Internet, nous trouverons beaucoup d’informations sur les listes, les dictionnaires et les tuples, mais peu sur deque.
Deque (on peut aussi le prononcer «pont » ) est un type de collection intéressant et utile en Python. Ce qui le rend différent des autres objets, c’est qu’il ne contiendra que le nombre d’éléments que vous souhaitez ou moins, jamais plus.
Une file d’attente à double extrémité ne contiendra que le nombre d’éléments que vous déterminez. Jamais plus.
Cela fonctionne donc comme un ponten utilisant le système FIFO (Premier entré, premier sorti). Une fois le deck plein, si vous ajoutez un autre élément, il supprimera le premier élément à gauche et ajoutera le nouveau à droite.
Voyons quelques exemples de base pour comprendre cette collection. Tout d’abord, importez-le depuis les collections : from collections import deque.
Créer un deque
Ensuite, nous allons créer un deck simple et y ajouter une longueur maximale de 3 éléments.
# Create a new deque with 3 (or less) elements
my_deck = deque(maxlen = 3)
# Adding one element
my_deck.append(1)
my_deck.append(2)
my_deck.append(3)
# View
my_deck
# deque([1, 2, 3])Bon. Une fois notre deck rempli, observez ce qui se passe lorsque j’essaie d’y ajouter une autre valeur. Le premier élément à gauche (1) est supprimé, ouvrant de l’espace pour le nouvel élément ajouté à droite (extra).
# It drops the first element and adds the new one at the end.
my_deck.append('extra')
deque([2, 3, 'extra'])Il fonctionne comme un deck utilisant le système FIFO (First In, First Out).
Ajouter des éléments à gauche
Maintenant, rappelez-vous que la collection est nommée ainsi file d’attente à double extrémité ; ainsi, vous pouvez également ajouter ou étendre des éléments vers la gauche. Dans ce cas, naturellement, l’élément situé à l’extrême droite sera supprimé.
# Append to left
my_deck.appendleft('left')
# [OUT]: deque(['left', 2, 3])
# Extend to left
my_deck.extendleft(['d', 'd'])
#[OUT]: deque(['d', 'd', 'left'])Rotation des éléments
Vous pouvez également faire pivoter les éléments en les déplaçant d’une (ou plusieurs) positions vers la droite ou la gauche.
# Create a new deque with 3 (or less) elements
my_deck = deque(maxlen = 3)
# Adding one element
my_deck.extend([1,2,3]) # deque([1, 2, 3])
# Rotating the elements by one position to the right
my_deck.rotate() # deque([3, 1, 2])
# Rotate to the left
my_deck.rotate(-1) # deque([1, 2, 3])Outre la rotation, il est facile d’inverser complètement le plateau.
# New deck
my_deck.extend([1, 2, 3])
#[OUT]: deque([1, 2, 3])
# Reverse deck
my_deck.reverse()
# [OUT]: deque([3, 2, 1])Supprimer des éléments
Dans un deck, vous pouvez supprimer un élément à gauche, à droite ou par son nom.
# New deck
my_deck = deque(maxlen = 3)
my_deck.extend([1, 2, 3])
# [OUT]: deque([1, 2, 3])
# Remove item from the left
my_deck.popleft()
# [OUT]: deque([2, 3])
#---
# New deck
my_deck = deque(maxlen = 3)
my_deck.extend([1, 2, 3])
# [OUT]: deque([1, 2, 3])
# Remove item from the right
my_deck.pop()
# [OUT]: deque([1, 2])
#---
# New deck
my_deck = deque(maxlen = 3)
my_deck.extend([1, 'a', 3])
# [OUT]: deque([1, 'a', 3])
# Remove item by name
my_deck.remove('a')
# [OUT]: deque([1, 3])Vous pouvez également supprimer tous les éléments et vider votre deck.
my_deck.clear()
#[OUT]: deque([])Applications
1. L’« Historique de recherche récent » (Gestion de la mémoire)
Alors que les listes s’allongent indéfiniment, deque a un maxlen paramètre. C’est parfait pour les fonctionnalités telles que « Récemment consulté » ou « Historique de recherche récent », où vous souhaitez uniquement conserver le dernier N éléments sans supprimer manuellement les anciens.
# Keep only the last 3 user searches
search_history = deque(maxlen=3)
search_history.append("Python tutorials")
search_history.append("Machine Learning")
search_history.append("Data Science")
search_history.append("Deep Learning") # "Python tutorials" is automatically removed
print(list(search_history))
# Output: ['Machine Learning', 'Data Science', 'Deep Learning']2. Flux de données en direct et moyennes mobiles
En science des données ou IoT, vous devez souvent calculer une moyenne mobile d’un flux (comme des capteurs de température ou des cours boursiers). Utiliser un deque vous permet de conserver efficacement une « fenêtre glissante » de données.
def moving_average(stream, window_size=5):
window = deque(maxlen=window_size)
for val in stream:
window.append(val)
if len(window) == window_size:
yield sum(window) / window_size
# Usage: Calculating average of a sensor reading stream
data_stream = [20, 21, 20, 22, 23, 25, 24]
print(list(moving_average(data_stream, window_size=3)))3. Files d’attente de tâches multithread (sécurité des threads)
L’un des avantages « cachés » de deque en CPython, c’est ça .append() et .popleft() sont thread-safe. Cela en fait un excellent choix pour un modèle simple producteur-consommateur dans lequel un thread ajoute des tâches et un autre les exécute.
import threading
from collections import deque
task_queue = deque()
def producer():
for i in range(5):
task_queue.append(f"Task {i}") # Thread-safe append
def consumer():
while True:
try:
task = task_queue.popleft() # Thread-safe pop
print(f"Processing {task}")
except IndexError:
breakVoyons cela en action.
# Generate Tasks
producer()
task_queue
# [OUT] deque(['Task 0', 'Task 1', 'Task 2', 'Task 3', 'Task 4'])
# Consume Tasks
consumer()
# [OUT]
# Processing Task 0
# Processing Task 1
# Processing Task 2
# Processing Task 3
# Processing Task 4
# Check Queue
task_queue
# [OUT] deque([])Avant de partir
Eh bien, vous connaissez maintenant un autre type de collection Python. Vous pouvez laisser libre cours à votre créativité et trouver de nouvelles façons de créer votre programme ou votre script.
Le résumé de cet article est simple :
- Syntaxe:
deque(maxlen = n)où nest le nombre d’éléments à stocker dans votre deck. - Par défaut, il supprimera le premier élément à gauche lorsque vous en ajouterez un nouveau à un deck complet.
- La collection
dequeaccepte tout type d’objets, tels que int, float, string, dataframe, etc. - Il existe de nombreuses méthodes pour le manipuler, telles que
reverse,clear,rotate,appendleft.

Si ce contenu vous intéresse, lisez-en davantage sur mon travail sur mon site Web.



