如何用Python字典实现数组元素按频率排序?求代码实现
按元素频率排序的Python实现方案
嘿,我来帮你搞定这个问题!先看看你现有代码里的几个明显问题:
- 统计频率时,
d.get(0,i)+1的参数搞反啦,get方法第一个参数是要查找的键(也就是数组里的元素i),第二个是默认值(没找到时用0),应该写成d.get(i, 0) + 1 - 后面的
a=max(d[i])完全不对路,d[i]是单个元素的频率数值,没法取最大值,而且你还没实现核心的排序逻辑 - 最后也没有按照「频率高优先,同频率数值小优先」的规则来输出结果
下面是修正后的完整代码,用字典统计频率,再通过自定义排序规则完美实现需求:
t = int(input()) for _ in range(t): n = int(input()) arr = list(map(int, input().split())) # 第一步:统计每个元素的出现频率 freq_dict = {} for num in arr: freq_dict[num] = freq_dict.get(num, 0) + 1 # 第二步:按照规则排序元素 # 排序key:先按频率降序(加负号把升序转降序),再按元素数值升序 sorted_elements = sorted(freq_dict.keys(), key=lambda x: (-freq_dict[x], x)) # 第三步:生成最终输出序列,每个元素重复对应频率次数 output = [] for elem in sorted_elements: output.extend([str(elem)] * freq_dict[elem]) # 打印结果 print(' '.join(output))
代码细节解释:
- 频率统计:用字典
freq_dict遍历数组,每遇到一个元素就把对应键的数值加1,get(num, 0)保证第一次遇到元素时不会报错,默认计数从0开始。 - 自定义排序:
sorted函数的key参数是关键,lambda x: (-freq_dict[x], x)表示:- 优先按
-freq_dict[x]排序,负号让原本的升序变成降序,这样频率高的元素排前面 - 当两个元素频率相同时,就按
x(元素本身的数值)升序排列,满足数值小的在前的要求
- 优先按
- 生成输出:把排序后的元素按各自频率重复,转成字符串后用空格拼接,这样输出格式就和要求一致了。
拿你给的输入示例测试一下:
输入:
1
13
2 5 5 5 4 6 4 5 9 9 9 2 5
运行后会输出:5 5 5 5 5 9 9 9 2 2 4 4 6,完全符合「频率高优先,同频率数值小优先」的规则。
内容的提问来源于stack exchange,提问作者manasvijain
相关产品推荐
相关产品推荐

