从值列表中查找所有局部极值

Finding all local extrema from a list of values

这是我的代码,我收到“列表索引超出范围”的错误,我试图通过考虑 for 循环之前的第一个和最后一个值来解决这个问题,但是我不知道如何制作for 循环排除第一个和最后一个对象,有什么想法吗?

def minmax(List):

    mins=[]
    maxs=[]

    if List[0]>List[1]: maxs.append(List[0])
    if List[0]<List[1]: mins.append(List[0])
        
    if List[-1]>List[-2]: maxs.append(List[-1])
    if List[0]<List[1]: mins.append(List[-1])
        
    for i in List[1:-1]:
        if List[i] < List[i-1] and List[i] < List[i+1]:
            mins.append(List[i])
        elif List[i] > List[i-1] and i> List[i+1]:
            maxs.append(List[i])
    return "mins",mins,"maxs",maxs
nums=[5,0,5,0,5]
minmax(nums)

你的错误在于你在 for 循环中访问元素的方式

for i in List[1:-1]:
        if List[i] < List[i-1] and List[i] < List[i+1]:
            mins.append(List[i])
        elif List[i] > List[i-1] and i> List[i+1]:
            maxs.append(List[i])

的确,i这里是List的一个元素,不是这个元素的索引,所以List[i]没有任何意义,List[i+1]List[i-1].

一个解决方法是使用 enumerate 来跟踪列表的当前值及其索引:

for n, i in enumerate(List[1:-1]):
        if List[n] < List[n-1] and List[n] < List[n+1]:
            mins.append(List[n])
        elif List[n] > List[n-1] and i> List[n+1]:
            maxs.append(List[n])

我强烈建议您使用调试器来了解此行为。