我有一个很大的连续数据列表,我试图找出最少条目数时数据在哪里增加,在哪里减少。例如,如果我有列表

[0, 1, 3, 8, 10, 13, 13, 8, 4, 11, 5, 1, 0]

我希望能够捕获 0、1、3、8、10、13、13 和 11、5、1、0 的运行,但不能捕获 8、4 的运行(因为它小于任意数量 3)。

目前我正在使用升序和降序函数一次捕获一定数量的运行(例如,0、1、3 和 1、3、8),但它没有在单个列表中获取整个长度.

关于如何解决这个问题的任何想法?

最佳答案

以下应该工作......它将数据分解为不相交的单调子序列,然后按您的长度标准进行过滤。

def get_monotonic_subsequences(data, min_length):
    direction = data[1] - data[0] #determine direction of initial subsequence
    subsequences = []
    cur_seq = []
    for i in range(0, len(data) - 1):
        if direction > 0:
            if (data[i] >= data[i-1]):
                cur_seq.append(data[i])
            else:
                subsequences.append(cur_seq)
                cur_seq = [data[i]]
                direction = data[i+1] - data[i]
        else:
            if (data[i] <= data[i-1]):
                cur_seq.append(data[i])
            else:
                subsequences.append(cur_seq)
                cur_seq = [data[i]]
                direction = data[i+1] - data[i]

    if  (data[-1] - data[-2])*direction > 0:
        cur_seq.append(data[-1])
        subsequences.append(cur_seq)
    else:
        subsequences.append(cur_seq)
        subsequences.append([data[-1]])
    return [x for x in subsequences if len(x) >= min_length]

顺便说一句,从您的问题中不清楚,但您的输出表明您希望从左到右贪婪地收集子序列,该代码假定了这一点。

关于python - 确定列表中升序或降序停止的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19142843/

10-11 22:45
查看更多