定义了startpoint的Ringbuffer?

2024-05-23 18:50:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中有没有一种简单的方法可以用“named”元素创建一个环缓冲区? 我指的是一个环形缓冲区,你可以很容易地跳到任何位置,开始在任何一个()中通过环形缓冲区方向。环形缓冲区应根据缓冲区的跨步方向返回不同的值

因此,要素应包含以下信息:

(value_in_ccw_direction, value_in_cw_direction)

理想情况下,还应该能够知道环形缓冲区的长度,以便知道何时读取了每个元素

我考虑了OrderedDict,因为您可以快速进入每个元素,并且顺序保持不变。但是,不能访问OrderedDict中的前一个元素。所以我需要一个dict和list的混合体(第一个和最后一个元素应该是融合的)


Tags: 方法in信息元素value方向named缓冲区
1条回答
网友
1楼 · 发布于 2024-05-23 18:50:40

可以在CircularBuffer类中使用两个^{}和maxlen arg,如下所示:

from collections import deque

class CircularBuffer(object):

    def __init__(self, max_length=10):
        self.value_deque = deque(maxlen=max_length)
        self.key_deque = deque(maxlen=max_length)

##  According to your needs
##    def __getitem__(self, key):
##        return self.value_deque[self.key_deque[key]]
##
##    def __setitem__(self, key, value):
##        self.value_deque

    def __len__(self):
        # Called to implement the built-in function len()
        return len(self.value_deque)


    def append(self, key, value):
        # add a new entry to the right side
        self.value_deque.append(value)
        self.key_deque.append(key)

    def appendleft(self, key, value):
        # add a new entry to the left side
        self.value_deque.appendleft(value)
        self.key_deque.appendleft(key)

    def pop(self):
        # return and remove the rightmost item
        return {self.value_deque.pop(): self.key_deque.pop()}

    def popleft(self):
        # return and remove the leftmost item
        return {self.value_deque.popleft(): self.key_deque.popleft()}

    def reverse(self):
        # reverse the contents of a deque in place
        self.value_deque.reverse()
        self.key_deque.reverse()

    def __contains__(self, item):
        pass

    def __str__(self):
        # Called by str(object) and the built-in functions format() and print()
        return_dict = {}
        for key, value in zip(self.key_deque, self.value_deque):
            return_dict[key] = value
        return str(return_dict)

在您的控制台中:

>>> a = CircularBuffer()
>>> a.append("test", 1)
>>> print(a.pop())
{1: 'test'}
>>> a.append("test", 1)
>>> a.append("key", "value")
>>> a.append("foo", "bar")
>>> print(len(a))
3
>>> print(a)
{'test': 1, 'key': 'value', 'foo': 'bar'}
>>> a.reverse()
>>> print(a)
{'foo': 'bar', 'key': 'value', 'test': 1}

根据您的要求进行更改。干杯

相关问题 更多 >