gpt4 book ai didi

Python 没有结果并且 KeyError :1

转载 作者:行者123 更新时间:2023-12-01 09:07:03 24 4
gpt4 key购买 nike

def fre(dic, k):
max_k = dic.keys()[0]
max_v = dic.values()[0]
while len(dic2) < k:
for key, value in dic.items():
if max_v < value:
max_k = key
max_v = value

dic2[max_k] = max_v
del dic[max_k]
return dic2
# dic is a dictionary, k is an int

这道题是求dic中第k个最大的值,并得到匹配的key:value对。但我遇到了运行问题并得到了 KeyError: 1。

最佳答案

问题是,每次循环时,您都会将 max_kmax_v 保留为刚刚找到的键值对。

由于这是最大值,因此字典中没有其他值会更大。因此,在循环结束时,您仍将拥有相同的 max_kmax_v。然后您将再次尝试 del dic[max_k],它会引发 KeyError,因为您已经删除了它。

解决方案很简单:将设置 max_kmax_v 到第一个元素的代码,并将其移到外循环中,这样它每次都会运行,而不是第一次:

while len(dic2) < k:
max_k = dic.keys()[0]
max_v = dic.values()[0]

for key, value in dic.items():
if max_v < value:
max_k = key
max_v = value

dic2[max_k] = max_v
del dic[max_k]
<小时/>

但是,当我们这样做时,有更简单(或者至少更难犯微妙错误)的方法来做到这一点。

最明显的是 sort the items by value ,然后取第一个 k:

import operator

def fre(dic, k):
return dict(sorted(dic.items(), key=operator.itemgetter(1), reverse=True)[:k])

有关关键功能如何工作以及 itemgetter 的更多信息,请参阅 Sorting HOWTO .

但是你可以提高效率。 sorted 显然必须对所有 n 值进行排序,只是为了获得顶部的 k,因此需要 O(n) > 空间和O(n log n) 时间。如果 kn 小很多,那么使用 heapq.nlargest 可以做得更好。 ,只需要 O(k) 空间和 O(n log k) 时间:

import heapq
import operator

def fre(dic, k):
return dict(heapq.nlargest(k, dic.items(), key=operator.itemgetter(1)))

无论哪种方式,这都不会从 dic 中删除键;如果您需要,您可以手动执行此操作:

def fre(dic, k):
dic2 = dict(heapq.nlargest(k, dic.items(), key=operator.itemgetter(1)))
for key in dic2:
del dic[key]
return dic2

关于Python 没有结果并且 KeyError :1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51957374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com