在1-D python列表中的峰值查找程序,如果(arr [x]> arr [x + 1]和arr,则列表'arr'中的索引'x'返回其索引的峰值[x]> arr [x-1])。 特殊情况 案例1:如果是第一个元素。只将它与第二个元素进行比较。如果arr [x]> arr [x + 1],找到了峰值。 案例2:最后一个元素。与前一个元素比较。如果arr [x]> arr [x-1],找到了峰值。 下面是代码。 由于某种原因,在峰值处于指数= 0的情况下它不起作用。它完全适用于中间的峰值和结束时的峰值。 非常感谢任何帮助。
import sys
def find_peak(lst):
for x in lst:
if x == 0 and lst[x] > lst[x+1]:
print "Peak found at index", x
print "Peak :", lst[x]
return
elif x == len(lst)-1 and lst[x] > lst[x-1]:
print "Peak found at index", x
print "Peak :", lst[x]
return
elif x > 0 and x < len(lst)-1:
if lst[x] > lst[x+1] and lst[x] > lst[x-1]:
print "Peak found at index", x
print "Peak :", lst[x]
return
else :
print "No peak found"
def main():
lst = []
for x in sys.argv[1:]:
lst.append(int(x))
find_peak(lst)
if __name__ == '__main__':
main()
Anuvrats-MacBook-Air:Python anuvrattiku$ python peak_finding_1D.py 1 2 3 4
Peak found at index 3
Peak : 4
Anuvrats-MacBook-Air:Python anuvrattiku$ python peak_finding_1D.py 1 2 3 4 3
Peak found at index 3
Peak : 4
Anuvrats-MacBook-Air:Python anuvrattiku$ python peak_finding_1D.py 4 3 2 1
No peak found
答案 0 :(得分:1)
您的问题在于循环初始化
for x in lst:
通过这个循环,对于你的上一个例子,x将是4,然后是3,然后是2,然后是1.
根据你的代码的外观,你似乎想说:
for x in range(len(lst)):
这将迭代列表的索引而不是列表中的值。你的代码看起来工作的原因是因为在你的测试用例中,列表的值与列表的索引非常匹配 - 考虑将来会有更多不同的测试。
答案 1 :(得分:1)
x是代码中的列表元素,您将其用作索引。
你应该写:
def find_peak(lst):
for i,x in enumerate(lst):
if i == 0 and x > lst[i+1]:
print "Peak found at index", i
print "Peak :", x
return
elif i == len(lst)-1 and x > lst[i-1]:
print "Peak found at index", i
print "Peak :", x
return
elif i > 0 and i < len(lst)-1:
if x > lst[i+1] and x > lst[i-1]:
print "Peak found at index", i
print "Peak :", x
return
else :
print "No peak found"