python - 查找字典中最大 4 个值的键
问题描述
这是我的 Python 代码的一部分,我试图找到spec
产生最大总和的 4 个连续值,然后找到相应 4 个键的加权平均值:
spec = {1.5:8, 1.3:9, 4.3:7, 3.2:3, 5.3:5, 4:1, 5.2:6, 4.2:4, 2.5:9}
k = 4
consecutive_elements = zip(*(islice(spec.values(), x, None) for x in range(k)))
max(map(sum, consecutive_elements)) # The maximum sum.
Wavg = np.average(list(???.keys()), weights=list(???.values())) # The weighted average
我不确定如何访问这 4 个键。在这种情况下,它们应该是,1.5, 1.3, 4.3, 3.2
因为它们的值之和是 27(最大值)。我应该使用哪些工具?
解决方案
您的数据实际上并不是一个映射,而是具有相应元素的一对序列。我建议将其可视化为:
keys = list(spec.keys())
vals = list(spec.keys())
从这里应该很清楚如何使用诸如在 Python 中实现 argmax 之类的东西:
consecutive_elements = zip(*(islice(spec.values(), x, None) for x in range(k)))
idx = max(enumerate(map(sum, consecutive_elements)), key=itemgetter(1))[0] # The maximum sum.
Wavg = sum(a * b for a, b in zip(keys[idx:idx + k], vals[idx:idx + k])) / sum(vals[idx:idx + k])
话虽这么说,如果你仍然使用 numpy,我会说承诺:
keys = np.fromiter(spec.keys(), float, count=len(spec))
vals = np.fromiter(spec.values(), float, count=len(spec))
idx = np.convolve(vals, np.ones(k), 'valid').argmax()
Wavg = np.average(keys[idx:idx + k], weights=vals[idx:idx + k])
两个版本的结果完全相同:
2.348148148148148
推荐阅读
- python - 解析文本文件并转换为 csv
- intellij-idea - intellij:数据库工具工具访问问题
- django - 静态文件 DJANGO
- python - 使用 Python 和 Boto3 从 S3 读取多个 CSV 文件
- powershell - 如何在计划任务中执行 Get-CrmConnection
- r - 返回顶点列表
- javascript - 如何通过 YouTube Data API 获取特定帐户(频道)发布的评论?
- javascript - 如何使用jquery触发dataTable搜索窗格的onclick事件?
- c# - 同时缩放两个游戏对象
- java - 如何以 application/x-www-form-urlencoded 在 restTemplate 中发送正文