在python中查找所有最大单调子序列

在python中查找所有最大单调子序列,python,list,Python,List,现在,我们试图找出如何在序列中找到所有的最大子序列(正数和负数)。在这里我遇到了一些麻烦,因为没有找到合适的解决方案。我有这个代码,但输出是确定的,只有正数。我是python的新手,所以无法在短时间内想出如何处理这个问题 testcase = [1,2,3,4,5,4,3,2,1,0,-1,-2,-3,-2,-1,-2,-1,-2,-3,-4,-5] def process(lst): def sub(lst): temp = [] while lst a

现在,我们试图找出如何在序列中找到所有的最大子序列(正数和负数)。在这里我遇到了一些麻烦,因为没有找到合适的解决方案。我有这个代码,但输出是确定的,只有正数。我是python的新手,所以无法在短时间内想出如何处理这个问题

testcase = [1,2,3,4,5,4,3,2,1,0,-1,-2,-3,-2,-1,-2,-1,-2,-3,-4,-5]
def process(lst):
    def sub(lst):
        temp = []
        while lst and (not temp or temp[-1] <= lst[0]):
            temp.append(lst[0])
            lst = lst[1:]
        return temp, lst

    res=[]
    while lst:
        subres, lst = sub(lst)
        res.append(subres[0] if len(subres)==1 else subres) 
    return res
if __name__ == "__main__":
    print(process(testcase))
然而,我希望它是

[[1,2,3,4],[5,4,3,2,1,0,-1,-2,-3],[-2,-1],-2,[-1,-2,-3,-4,-5]]

因此,问题是如何做到这一点?

您基本上需要跟踪“导数”(元素之间的差异),并查看它何时改变方向

您可以使用
numpy
非常清晰地表达这一点:

import numpy as np
np_split_indexes= np.where(np.diff(np.diff(testcase))!=0)[0]+2
split_indexes= [0] + list(np_split_indexes) + [len(testcase)]
result= [testcase[a:b] for a,b in zip(split_indexes[:-1],split_indexes[1:])]
或者,如果您更喜欢纯python:

result=[]
tmp=[]
last_direction=0;
last_element=0;
for x in testcase:
    direction= (x-last_element)/abs(x-last_element) #math trick - divide by the magnitude to get the direction (-1/1)
    last_element= x
    if (direction!=last_direction) and tmp:
        result.append(tmp)
        tmp=[]
    last_direction= direction
    tmp.append(x)
if tmp:
    result.append(tmp)

print result
输出:

[[1, 2, 3, 4, 5], [4, 3, 2, 1, 0, -1, -2, -3], [-2, -1], [-2], [-1], [-2, -3, -4, -5]]

注意,这与最后的预期输出不同。我不知道你为什么把
-1
分组到最后一个组中,因为它是一个局部最大值。

所以,(1)每个数字恰好是一个子序列的一部分,(2)如果一个数字可能是两个子序列的一部分,请将其添加到较大的一个子序列中。我建议从这些索引中拆分子列表。在你的示例中用括号括起来似乎是错误的。那些非列表整数是什么?
5
不应该是第二个序列的一部分吗?@tobias_k,接得好。第二份清单中应包括5份。非列表整数是长度为1的元素。为什么要将[-2]和[-1]拆分为两个单独的列表?这看起来像[-2,-1],我不明白为什么输出不同。@user3441253代码依赖于查找局部极小值,而极大值-
-2
是局部极小值(局部序列
-1,-2,-1
),而-1是局部极大值(局部序列
-2,-1,-2
)。稍后可以联接这些子序列,但请注意,“最大单调序列”是不明确的。您可以将它们分组为
[-2,-1]、-2,-1]、-2,-3,-4,-5]
[-2,-1]、-2,-3,-4,-5]
谢谢您的澄清,我会记住这一点。
[[1, 2, 3, 4, 5], [4, 3, 2, 1, 0, -1, -2, -3], [-2, -1], [-2], [-1], [-2, -3, -4, -5]]