有任何方法可以跟踪python中的最后5个数据点

use*_*ser 7 python

所以我有一个包含多个数字的数组.当我的脚本运行时,会有越来越多的数字附加到此数组中.但是,我对所有数字都不感兴趣,只是想跟踪最后5个数字.

目前,我只是将所有数字存储在数组中.但是,这个数组变得非常大,并且充满了不必要的信息.

我已经考虑过制作一个函数,当它向数组添加一个元素时,如果数组已经包含5个数字,也会删除最后一个元素.

我还想过创建一个新类来创建一个能够满足我想要的数据结构.但是,我只需要偶尔引用这个数组,这只是脚本的一小部分.所以我认为如果我创建一个全新的类来做这件事就太过分了.

做这个的最好方式是什么?

sho*_*ter 11

尝试使用deque:http: //docs.python.org/library/collections.html#deque-objects

"如果未指定maxlen或者为None,则deques可能会增长到任意长度.否则,deque将限制为指定的最大长度.一旦有限长度deque已满,添加新项目时,相应数量的项目为有限长度deques提供与Unix中的尾部过滤器类似的功能.它们还可用于跟踪仅涉及最近活动的事务和其他数据池."


Dav*_*d Z 5

我使用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)

等等.