Python没有结果键错误:1

2024-04-19 18:44:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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对。但我遇到了运行问题,并得到了关键错误:1。你知道吗


Tags: keyinforlenisvaluedefitems
1条回答
网友
1楼 · 发布于 2024-04-19 18:44:23

问题是,每次通过循环时,都会将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小很多,那么使用^{}可以做得更好,它只需要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

相关问题 更多 >