功能,返回峰值

时间:2016-10-27 05:54:38

标签: python iterator

def peaks(iterable):
    z = []
    i = iter(iterable)
    v2 = next(i)

    try:
        while True:
            v1, v2 = v2, next(i)
            if v1 > v2:
                z.append(v1)
            elif v1 < v2:
                continue
    except StopIteration:
        pass

    return z 

此函数返回迭代中那些值的int列表,这些值大于前面和后面的值:peaks([0, 1, -1, 3, 8, 4, 3, 5, 4, 3, 8])返回[1, 8, 5]。这个结果意味着值1,8和5严格地大于它们之前和之后的值。

但是,当我[0, 1, -1, 3, 8, 4, 3, 5, 4, 3, 8]时,它会返回[1, 8, 4, 5, 4]而不是[1, 8, 5]

当我[5, 2, 4, 9, 6, 1, 3, 8, 0, 7]时,它会返回[5, 9, 6, 8]而不是[9, 8]

有人可以告诉我如何解决它吗?感谢。

1 个答案:

答案 0 :(得分:0)

您返回的值大于以下值。您还需要检查它们是否比以前更大。

def peaks(iterable):
    z = []
    i = iter(iterable)

    try:
        v2 = next(i)
        v3 = next(i)
        while True:
            v1, v2, v3 = v2, v3, next(i)
            if v2 > v1 and v2 > v3:
                z.append(v2)
    except StopIteration:
        pass

    return z

print(peaks([0, 1, -1, 3, 8, 4, 3, 5, 4, 3, 8]))  # [1, 8, 5]

[0, 1, 1, 0]中找不到峰值。希望,这就是你想要的。