按频率排序数组元素报错:请求协助修正代码
修正按元素频率排序数组的代码
嘿,我经常遇到开发者在按元素频率排序数组时踩类似的坑!先假设你可能写了这样的错误代码:
arr = [4, 6, 2, 6, 4, 4, 6] frequency = {} for num in arr: frequency[num] = frequency[num] + 1 # 第一次遇到元素时会触发KeyError # 尝试按频率排序 sorted_arr = sorted(arr, key=lambda x: frequency[x]) print(sorted_arr)
错误原因
这段代码会抛出KeyError,因为第一次遍历数组里的新元素时,字典frequency中还没有对应的键,直接执行frequency[num] + 1就会找不到键而报错。
修正方案
我给你两种可靠的修正方式,你可以根据需求选择:
方法一:用字典的get()方法安全统计频率
arr = [4, 6, 2, 6, 4, 4, 6] frequency = {} for num in arr: # 若键不存在,默认返回0,避免KeyError frequency[num] = frequency.get(num, 0) + 1 # 按频率降序排列,频率相同时按元素本身升序排序 sorted_arr = sorted(arr, key=lambda x: (-frequency[x], x)) print(sorted_arr) # 输出: [4, 4, 4, 6, 6, 6, 2]
方法二:用collections.Counter(更简洁高效)
Python的标准库collections里的Counter专门用来统计元素频率,代码会更简洁:
from collections import Counter arr = [4, 6, 2, 6, 4, 4, 6] frequency = Counter(arr) # 同样实现频率降序、元素升序的排序逻辑 sorted_arr = sorted(arr, key=lambda x: (-frequency[x], x)) print(sorted_arr)
关键细节说明
frequency.get(num, 0):当字典中没有num这个键时,会返回默认值0,完美解决第一次统计时的键不存在问题- 排序的
key参数(-frequency[x], x):负号让频率高的元素排在前面;第二个元素x保证当两个元素频率相同时,按元素本身的大小升序排列(如果想要元素降序,改成-x即可)
内容的提问来源于stack exchange,提问作者Kamal Arora
相关产品推荐
相关产品推荐

