如何在函数中使用iter和next来返回峰值列表?

时间:2014-11-03 05:03:28

标签: python-3.x

问题:

我需要定义一个传递给iterable as参数的peak函数,通过计算这个iterable,函数应该返回一个峰值列表。我可以创建的唯一数据结构是列表返回;不使用中间数据结构来帮助计算:例如,我无法创建包含iterable中所有值的列表。请注意,我也不能假设参数是可索引的,也不能为它计算len:它只是可迭代的。

例如:

peaks([0,1,-1,3,8,4,3,5,4,3,8]) returns [1, 8, 5]. 

此结果表示值1,8和5严格大于紧接其前后的值。

def peaks(iterable):
    l=[]
    i=iter(iterable)
    v=next(i)
    try:
        while True:
            if v>next(iter(iterable)):
                l.append(v)
            v=next(i)
    except StopIteration:
        pass
    return l

调用这些应该给我:

peaks([0,1,-1,3,8,4,3,5,4,3,8]) --> [1,8,5]
peaks([5,2,4,9,6,1,3,8,0,7]) -->[9,8]

但我得到了:

peaks([0,1,-1,3,8,4,3,5,4,3,8]) --> [1, 3, 8, 4, 3, 5, 4, 3, 8]
peaks([5,2,4,9,6,1,3,8,0,7]) --> [9, 6, 8, 7]

请帮我解决这个问题,我花了很多时间在上面,并没有取得任何进展。并且,我不知道如何编写if语句来检查紧接在之前和之后的值。任何帮助都会很棒!由于我的英语不好,实际的代码会非常受欢迎。

1 个答案:

答案 0 :(得分:0)

def peaks(L):
    answer = []
    a,b,c = itertools.tee(L, 3)
    next(b)
    next(c)
    next(c)
    for first, second, third in zip(a,b,c):
        if first <= second >= third:
            answer.append(second)
    return answer

In [61]: peaks([0,1,-1,3,8,4,3,5,4,3,8])
Out[61]: [1, 8, 5]

In [62]: peaks([5,2,4,9,6,1,3,8,0,7])
Out[62]: [9, 8]