查找字典中最大 4 个值的键

Posted

技术标签:

【中文标题】查找字典中最大 4 个值的键【英文标题】:Find keys of the largest 4 values in a dictionary 【发布时间】:2021-07-07 04:12:01 【问题描述】:

这是我的 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(最大值)。我应该使用哪些工具?

【问题讨论】:

【参考方案1】:

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

keys = list(spec.keys())
vals = list(spec.keys())

从这里应该很清楚如何使用implementing argmax in Python:

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

【讨论】:

@ZR-。很高兴它对你有效。我添加了更新

以上是关于查找字典中最大 4 个值的键的主要内容,如果未能解决你的问题,请参考以下文章

在字典中查找最大值[重复]

使用过滤器方法并从给定字典中查找值在 5 到 8 之间的键

使用 Counter() 查找字典中的键

如何在嵌套字典中查找所有出现的键,同时跟踪外部字典键值?

在字典中查找重复列表并打印重复列表的键

在嵌套字典和列表中查找所有出现的键