在python中有没有一种简单的方法来创建一个带有“命名”元素的环缓冲区?我指的是环形缓冲区,因为您可以很容易地跳到任何位置来开始单步执行环形缓冲区,在(!)方向。环缓冲区应该根据缓冲区所经过的方向返回不同的值。
因此,元素应包含以下信息:
(value_in_ccw_direction, value_in_cw_direction)理想情况下,您还应该能够知道环形缓冲区的长度,这样您就可以知道何时读取了每个元素。
我想到了OrderedDict,因为您可以快速进入每个元素,并且顺序保持不变。但是,您不能访问OrderedDict中的前一个元素。所以我需要一个dict和list的混合体(第一个和最后一个元素应该融合在一起)…
发布于 2018-02-21 20:04:23
您可以在CircularBuffer类中使用两个带有maxlen arg的collections.deque,如下所示:
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}根据您的需求进行更改。干杯!!
https://stackoverflow.com/questions/48904268
复制相似问题