如何基于字典值提取键并解决LeetCode前K高频元素问题
解决LeetCode前K个高频元素问题及代码错误修复
先解决你遇到的TypeError错误
你代码里的for key, value in nums_hash:这行有问题——直接遍历字典时,默认只会迭代它的键,每次循环拿到的是单个整数(比如1、2、3),你却试图把它拆成key和value两个变量,自然会报cannot unpack non-iterable int object。
要遍历字典的键值对,必须调用items()方法,改成:
for key, value in nums_hash.items():
再修正你的逻辑(题目理解偏差)
你当前的逻辑是找频率≥k的元素,但题目要求的是出现频率前k高的元素。比如示例输入[1,1,1,2,2,3],k=2,要返回的是出现次数最多的前2个元素(1和2),而不是所有出现次数≥2的元素(虽然结果碰巧一样,但换个测试用例逻辑就会出错)。
正确的做法是:
- 统计完频率字典后,把键值对按频率降序排序
- 取排序后的前k个键
修正后的完整代码
def most(nums, k): nums_hash = {} nums_list = [] # 统计频率(这部分你写的是对的) for number in nums: if number in nums_hash: nums_hash[number] += 1 else: nums_hash[number] = 1 # 按频率降序排序键值对,取前k个键 sorted_items = sorted(nums_hash.items(), key=lambda x: x[1], reverse=True) nums_list = [item[0] for item in sorted_items[:k]] return nums_list print(most([1,1,1,2,2,3], k=2)) # 输出 [1,2]
额外优化:用collections.Counter简化统计
Python的collections.Counter可以直接帮你统计频率,不用自己写循环:
from collections import Counter def most(nums, k): # Counter直接统计频率,most_common(k)返回前k个高频元素的元组列表 return [item[0] for item in Counter(nums).most_common(k)] print(most([1,1,1,2,2,3], k=2)) # 输出 [1,2]
内容的提问来源于stack exchange,提问作者user22248976
相关产品推荐
相关产品推荐

