Python 字符串 FIFO

6 投票
3 回答
4439 浏览
提问于 2025-04-17 12:43

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

使用示例:

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

我看过Queue,但是当我想添加一个字符串时,我必须手动拆分每个字节,否则整个字符串就会作为一个项目放入队列里。有没有类似的东西已经存在了?

3 个回答

0

那字符串类型本身怎么样呢?

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

这里唯一看起来有点别扭的就是get()这个用法。

1

我知道这个帖子已经很久了,但如果你使用连接操作,deque对象其实已经支持“字符串缓冲”了:

>>> from collections import deque
>>> string_buffer = dequeue()
>>> string_buffer.append("a")
>>> string_buffer.append("b")
>>> "".join(string_buffer)
ab

所以不需要再写一个新的类。

3

使用 collections.deque 的话,可以这样来实现:

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

示例输出:

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

撰写回答