[英]Python got no result and KeyError:1
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_k
和max_v
留给您刚刚找到的键值对。
由于这是最大值,字典中没有其他值会更大。 因此,在循环结束时,您仍将拥有相同的max_k
和max_v
。 然后你会再次尝试del dic[max_k]
,它会引发一个KeyError
,因为你已经删除了它。
解决方案很简单:将设置max_k
和max_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]
但是,虽然我们正在这样做,但有更简单(或至少更难弄巧成拙)的方法来做到这一点。
最明显的是按 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)
时间。 如果k
比n
小很多,你可以通过使用heapq.nlargest
做得更好, 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.