python - 查找数组的局部最大值及其位置Python的问题
问题描述
所以基本上我正在尝试完成这项任务:https ://www.codewars.com/kata/5279f6fe5ab7f447890006a7
问题:为什么我的函数将位置 11 计为这个特定数组的局部最大值?这是我的代码:
def main():
arr = [1,2,5,4,3,2,3,6,4,1,2,3,3,4,5,3,2,1,2,3,5,5,4,3]
maxes = []
positions = []
dic = {"pos":positions, "peaks":maxes}
for i in range(1,len(arr)-1):
try:
if arr[i] > arr[i+1] and arr[i] > arr[i-1]:
maxes.append(arr[i])
positions.append(i)
elif arr[i] > arr[i-1] and arr[i] == arr[i+1]:
for a in range(i+1,len(arr)):
if arr[a] > arr[a+1]:
maxes.append(arr[i])
positions.append(i)
break
except IndexError:
pass
print(dic)
main()
我的输出:
{'pos': [2, 7, 11, 14, 20], 'peaks': [5, 6, 3, 5, 5]}
正确的输出:
{'pos': [2, 7, 14, 20], 'peaks': [5, 6, 5, 5]}
解决方案
当您看到类似“2, 3 ,3, 4,5,3 ...?”的情况时 您保存位置并进一步运行尝试找出:1)最后值较小(这是峰值,保存的值派上用场),2)值较大(不是峰值,高原,保存的值没有用)。
在第二种情况下的特定情况下:
elif arr[i] > arr[i-1] and arr[i] == arr[i+1]:
您从 second 开始迭代3
并仅在 时停止arr[a] > arr[a+1]
。在这一刻,您附加旧i
值(表示前 3 个):
maxes.append(arr[i]); positions.append(i)
也就是说,您没有考虑到值进一步可能更大并且您需要中断。
该函数的工作示例如下所示:
def main():
arr = [1,2,5,4,3,2,3,6,4,1,2,3,3,4,5,3,2,1,2,3,5,5,4,3]
dic = {'pos' : [], 'peaks' : []}
i, n = 1, len(arr)
while i < n - 1:
if arr[i-1] < arr[i] > arr[i+1]:
dic['peaks'].append(arr[i])
dic['pos'].append(i)
i += 1
else:
if arr[i-1] < arr[i] and arr[i] == arr[i+1]:
mem = i
while i < n -1 and arr[i] == arr[i+1]:
i += 1
if i == n - 1:
return dic
if arr[i] > arr[i+1]:
dic['peaks'].append(arr[mem])
dic['pos'].append(mem)
else:
i += 1
else:
i += 1
return dic
print(main())
推荐阅读
- java - 如何将文本文件读入固定大小的字符串数组
- testing - 在 ROBOT 框架的变量中添加 Json 数据
- prometheus - 如何在 Spring Cloud Dataflow Server 上使用 /management/prometheus
- python - 将多个操作应用于函数中的单个数据帧的执行方式?
- swift - 点击标签栏项目时快速禁用pop vc动画
- node.js - 如何覆盖feathersjs + typescript中的服务方法
- python - 如何用输入字符串中的相应字符串切片替换所有“&int-int”?
- c++ - clGetProgramBuildInfo在ubuntu下不返回日志信息(Quadro P4000)
- jquery - geojson如何在openstreet地图中正确隐藏其他国家
- reactjs - 如何使 AMP 轮播与 AMP 脚本一起使用