2012-02-09 6 views
2

Python a-t-il des types de données pour la mise en tampon FIFO des chaînes? J'ai créé quelque chose (ci-dessous) mais je suspecte que je réinvente la roue.Chaîne Python FIFO

class Buffer(list): 
    def __init__(self): 
     super(Buffer, self).__init__() 

    def put(self, nlmsg): 
     for c in nlmsg: self.append(c) 

    def peek(self, number): 
     return "".join([self[i] for i in range(number)]) 

    def get(self, number): 
     return "".join([self.pop(0) for i in range(number)]) 

Exemple d'utilisation:

>>> buf = Buffer() 
>>> buf.put('abcdefg') 
>>> buf 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> buf.peek(4) 
'abcd' 
>>> buf 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> buf.get(5) 
'abcde' 
>>> buf 
['f', 'g'] 

Je regardais Queue, mais l'ajout d'un str je dois diviser chaque octet manuellement, sinon l'ensemble str deviendrait un élément dans la file d'attente. Y a-t-il quelque chose comme ça déjà là?

+1

Est-ce que StringIO faire ce dont vous avez besoin? http://docs.python.org/library/io.html#io.StringIO –

+0

@ThomasK Je n'avais pas regardé ça. mais en un coup d'oeil, il semble que cela ne fonctionne pas, car lorsque je lis sur le devant, il me semble que je devrais déplacer les données restantes, ou garder un pointeur vers l'endroit où je lis dans la chaîne. (Im une sorte de newb, donc je pourrais manquer quelque chose) – tMC

+0

Un emballage de classe est-ce que je suis une bonne idée. Je hériterais de 'str' plutôt que de la liste cependant. String a déjà des capacités de découpage et cela permettrait d'économiser le coût d'utilisation de 'join'. 'timeit' et voyez ce qui fonctionne mieux :) –

Répondre

3

En utilisant collections.deque il serait mis en œuvre comme suit:

from collections import deque 

class Buffer(deque): 
    def put(self, iterable): 
     for i in iterable: 
      self.append(i) 

    def peek(self, how_many): 
     return ''.join([self[i] for i in xrange(how_many)]) 

    def get(self, how_many): 
     return ''.join([self.popleft() for _ in xrange(how_many)]) 



buf = Buffer() 
buf.put('abcdefg') 
print buf 
print buf.peek(4) 
print buf 
print buf.get(5) 
print buf 

sortie Exemple:

deque(['a', 'b', 'c', 'd', 'e', 'f', 'g']) 
abcd 
deque(['a', 'b', 'c', 'd', 'e', 'f', 'g']) 
abcde 
deque(['f', 'g']) 
0

Que diriez-vous du type de chaîne lui-même?

>>> buf = "" 
>>> buf += "abcdefg" 
>>> buf 
'abcdefg' 
>>> list(buf) 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> buf[:4] # instead of peek 
'abcd' 
>>> got,buf = buf[:5],buf[5:] # instead of get 
>>> got 
'abcde' 
>>> buf 
'fg' 

L'idiome pour get() est la seule chose qui est sensiblement moche ici.

+0

C'était ma première pensée, mais je pensais plutôt utiliser une' liste' puisque les chaînes ne sont pas modifiables. – tMC

+1

Si vous souhaitez utiliser une liste, consultez plutôt 'collecitons.deque'. – kindall