Python中基于频率与出现位置的排序异常问题排查
问题根源:同频率元素的排序逻辑不符合需求
你遇到的问题核心在于 collections.Counter.most_common() 方法的默认行为:当多个元素频率相同时,它是按照元素的哈希值进行排序的,而不是按照元素在输入中第一次出现的顺序。这就导致同频率元素的顺序会出现随机性(依赖于元素的哈希特性),所以你有时得到符合预期的结果,有时却不是。
解决方案:加入首次出现位置作为排序依据
要实现「先按频率降序,频率相同则按元素首次出现的顺序升序」的规则,我们需要额外记录每个元素第一次出现的位置,把这个位置作为排序的次要判断条件。修改后的代码如下:
import collections numbers = input().strip().split(" ") # 记录每个元素第一次出现的索引(字典键唯一,后续重复元素会自动跳过首次记录) first_occurrence = {num: idx for idx, num in enumerate(numbers)} counter = collections.Counter(numbers) # 排序规则:先按频率降序,再按首次出现的索引升序 sorted_list = sorted(counter.items(), key=lambda x: (-x[1], first_occurrence[x[0]])) # 拼接结果列表 ans = [] for val, count in sorted_list: ans.extend([val] * count) # 输出最终结果 print(" ".join(ans))
关键修改点说明
- 新增首次出现位置记录:
first_occurrence字典通过遍历输入列表,只保留每个元素第一次出现的索引,为后续排序提供顺序依据。 - 调整排序逻辑:排序的
key参数改为元组(-x[1], first_occurrence[x[0]]):-x[1]确保频率高的元素排在前面;first_occurrence[x[0]]确保频率相同的元素,第一次出现早的排在前面。
- 优化结果输出:用
extend拼接结果列表,最后一次性join输出,避免原代码末尾多余空格的问题。
测试你的输入 3 2 4 6 2 4 3 3 4 5 6 3 2 4 5 5 3,修改后的代码会稳定输出符合预期的结果:
3 3 3 3 3 4 4 4 4 2 2 2 5 5 5 6 6
内容的提问来源于stack exchange,提问作者Divakar Rajesh
相关产品推荐
相关产品推荐

