问题:
我需要定义一个传递给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语句来检查紧接在之前和之后的值。任何帮助都会很棒!由于我的英语不好,实际的代码会非常受欢迎。
答案 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]