2014-11-03 44 views
0

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

我需要定义其传递到一个可迭代的参数峰函数,通过计算此迭代器,函数应该返回峰的列表。我可以创建的唯一数据结构是列表正在返回;不使用中间数据结构来帮助计算:例如,我无法用迭代中的所有值创建列表。请注意,我也不能假定参数是可索引的,也不能为它计算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语句来检查紧接前后的值。任何帮助都会很棒!由于我的英语不好,实际的代码会非常感激。

回答

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] 
+0

感谢您的帮助! ^^ – Saoish 2014-11-03 06:55:10

相关问题