所以我有一个包含多个数字的数组.当我的脚本运行时,会有越来越多的数字附加到此数组中.但是,我对所有数字都不感兴趣,只是想跟踪最后5个数字.
目前,我只是将所有数字存储在数组中.但是,这个数组变得非常大,并且充满了不必要的信息.
我已经考虑过制作一个函数,当它向数组添加一个元素时,如果数组已经包含5个数字,也会删除最后一个元素.
我还想过创建一个新类来创建一个能够满足我想要的数据结构.但是,我只需要偶尔引用这个数组,这只是脚本的一小部分.所以我认为如果我创建一个全新的类来做这件事就太过分了.
做这个的最好方式是什么?
sho*_*ter 11
尝试使用deque:http: //docs.python.org/library/collections.html#deque-objects
"如果未指定maxlen或者为None,则deques可能会增长到任意长度.否则,deque将限制为指定的最大长度.一旦有限长度deque已满,添加新项目时,相应数量的项目为有限长度deques提供与Unix中的尾部过滤器类似的功能.它们还可用于跟踪仅涉及最近活动的事务和其他数据池."
我使用Python的有限长度的想法完全一致deque,如果它是可用的,如果没有,迈克尔·安德森的简单的解决方案是相当充足的.(我upvoted两者),但我只是想提一个环形缓冲区,它通常用于这样的任务时,低内存占用,高执行速度是很重要的第三个选项.(换句话说,在情况下,你可能不会使用Python :-P)例如,Linux内核使用该结构来存储记录在引导过程中生成的消息,系统日志开始之前.
Python实现可能如下所示:
class RingBuffer(object):
def __init__(self, n):
self._buf = [None] * n
self._index = 0
self._valid = 0
def add(self, obj):
n = len(self._buf)
self._buf[self._index] = obj
self._index += 1
if self._index == n
self._index = 0
if self._valid < n:
self._valid += 1
def __len__(self):
return self._valid
# could include other methods for accessing or modifying the contents
Run Code Online (Sandbox Code Playgroud)
基本上它所做的是预分配一个具有所需长度的数组(在Python中,一个列表)并用虚拟值填充它.缓冲区还包含一个"索引",指向列表中应填充值的下一个位置.每次添加一个值时,它都存储在该点中,并且索引会递增.当索引达到数组的长度时,它将重置为零.这是一个例子(我正在使用0而不是None虚拟值,因为它更快地输入):
[0,0,0,0,0]
^
# add 1
[1,0,0,0,0]
^
# add 2
[1,2,0,0,0]
^
# add 3
[1,2,3,0,0]
^
# add 4
[1,2,3,4,0]
^
# add 5
[1,2,3,4,5]
^
# add 6
[6,2,3,4,5]
^
# add 7
[6,7,3,4,5]
^
Run Code Online (Sandbox Code Playgroud)
等等.