python - 确定列表升序或降序停止的位置

标签 python list sorting

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

[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 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

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

相关文章:

python - readthedocs 和 autodoc - 我如何 "enable virtualenv"?

python - 在外部文件中存储字典、正则表达式和变量的最佳方式?

python - 在python中对字符串列表进行排序,以便特定字符串(如果存在)首先出现

java - 在颜色之后对 arraylist 进行排序

python - 字符串模板 4 和 Python

java - 高质量语言;整数列表作为输入查询

c# - 如何在 C# 中生成多维列表<>

javascript - 通过将 a.localeCompare(b) 切换为 (a<b?-1 :(a>b? 1:0)),排序速度提高 400 倍

Javascript 使用 'pre year' 自定义按年份对对象数组进行排序

python - 在 Python 中对常量变量使用大写字母是正确的形式吗?