确定列表中升序或降序停止的地方

2024-04-25 18:10:30 发布

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

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

[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),但它不能在单个列表中获得整个长度。你知道吗

有什么办法解决这个问题吗?你知道吗


Tags: 数据函数列表数量办法升序降序
2条回答

单调无重叠:

这个版本发现单调序列,不注册重叠;抱歉没有注意到最初。你知道吗

def find_sequences(lst, min_len=3):
    curr = []
    asc = None
    for i in lst:
        if not curr or len(curr) == 1 or asc and i >= curr[-1] or not asc and i <= curr[-1]:
            if len(curr) == 1:
                asc = curr[-1] < i
            curr.append(i)
        else:
            if len(curr) >= min_len:
                yield curr
            asc = None
            curr = [i]
    if len(curr) >= min_len:
        yield curr

收益率:

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

性能:

In [6]: timeit list(find_sequences(x))
100000 loops, best of 3: 8.44 µs per loop

单调/非单调重叠:

此函数用于查找单调和重叠序列;您可以通过将>=<=分别更改为><来轻松地将其更改为非单调工作,甚至可以将其参数化。你知道吗

def find_sequences(lst, min_len=3):
    asc, desc = [], []
    for i in lst:
        if not asc or i >= asc[-1]:
            asc.append(i)
        else:
            if len(asc) >= min_len:
                yield asc
            asc = [i]

        if not desc or i <= desc[-1]:
            desc.append(i)
        else:
            if len(desc) >= min_len:
                yield desc
            desc = [i]

    if len(desc) >= min_len:
        yield desc
    if len(asc) >= min_len:
        yield asc

收益率:

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

性能:

In [3]: timeit list(find_sequences(x))
100000 loops, best of 3: 10.5 µs per loop

下面的方法应该有用。。。它将数据分解为不相交的单调子序列,然后根据长度标准进行过滤。你知道吗

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]

另一方面,您的问题还不清楚,但是您的输出表明您希望从左到右贪婪地收集子序列,这是代码假定的。你知道吗

相关问题 更多 >

    热门问题