You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:13:16