2009-12-19 12 views
23

Je voudrais savoir s'il existe un type de données natif en Python qui agit comme un tampon FIFO de longueur fixe. Par exemple, je veux créer un tampon FIFO de longueur 5 qui est initialisé avec tous les zéros. Ensuite, il pourrait ressembler à ceci:Python Type de données pour une FIFO de longueur fixe

[0,0,0,0,0]

Puis, quand je l'appelle la fonction de vente sur l'objet, il se déplacera de la dernière zéro et mettre la nouvelle valeur, par exemple 1, sur le côté gauche:

[1,0,0,0,0]

Si je mets un 2, il serait alors passer et mis à ressembler à ceci:

[2,1,0,0,0]

... et s o on. La nouvelle valeur va à l'avant et la plus ancienne est décalée. Je comprends que ce serait très facile à implémenter moi-même, mais je voudrais utiliser des types de données python natifs si possible. Est-ce que quelqu'un sait quel type de données serait le meilleur pour cela?

Répondre

43
x = collections.deque(5*[0], 5) 

Voir the docs pour plus sur collections.deque; la méthode que vous appelez push s'appelle en réalité appendleft dans ce type.

Le deuxième paramètre (maxlen, donnant les longueurs maximales) a été ajouté en Python 2.6; Si vous utilisez des versions antérieures de Python, elles ne seront pas disponibles.

+0

Merci. C'est tout. – Doughy

2

Encore un exemple à ce poste

from collections import deque 

domains = ['1.com','2.com','3.com'] 
d = deque(domains)    
d.pop() #pop(delete) 3.com here 
d.appendleft('new.com') 


print d 

Résultat:

+0

Pourquoi utiliser pop et pas maxlen? –

7

vous pouvez également utiliser la liste

a = [0,0,0,0,0] 

a.pop(0) 
a.append(1) 

print a 
result [0,0,0,0,1] 

ou pour le côté gauche dès la sortie, sinon

a.pop(5) 
a.insert(0,1) 
print a 
result [1,0,0,0,0] 
+1

-1 Ceci n'est pas recommandé. Pour la raison pourquoi lire les doc http://docs.python.org/library/collections.html?highlight=collections.deque#collections.deque – toom

+3

@toom il n'est pas recommandé, vous devez juste être conscient de la pénalité d'utiliser des listes. Pour simplifier, une liste est difficile à battre. –

Questions connexes