首页 > 解决方案 > 查找字典中最大 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(最大值)。我应该使用哪些工具?

标签: pythondictionary

解决方案


您的数据实际上并不是一个映射,而是具有相应元素的一对序列。我建议将其可视化为:

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

推荐阅读