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

Python排序问题:二进制零数相同元素未按输入顺序排序

问题:整数按二进制0个数排序时未保留输入原始顺序

需求说明

程序需接收N个整数作为输入,按照其二进制表示中0的个数升序排序;若多个整数的二进制0个数相同,则按输入顺序排序,最后输出排序后的整数。

现有代码

n=int(input())
l=list(map(int,input().split()))
bc=[]
for i in range(n):
  b=bin(l[i])[2:]
  c=b.count('0')
  bc.append(c)
z=zip(bc,l)
g=[x for y,x in sorted(z)]
print(*g)

测试用例

  • 输入:
    5
    4 3 8 7 1
    
  • 预期输出:3 7 1 4 8
  • 实际输出:1 3 7 4 8

问题原因

现有代码中,sorted(z)对(0的个数, 数值)的元组排序时,当两个元组的第一个元素(0的个数)相同时,Python会自动比较第二个元素(数值本身),导致相同0个数的元素按数值大小排序,而非输入顺序,违反了需求。

修正方案

要保留输入顺序,排序时需要引入元素的原始索引作为次要排序依据——索引按输入顺序递增,相同0个数时,索引小的元素会排在前面。

方案一(推荐,支持重复数值)

n = int(input())
l = list(map(int, input().split()))
# 生成包含(0的个数, 原始索引, 数值)的列表,按(0个数, 索引)排序
sorted_items = sorted(
    [(bin(num)[2:].count('0'), idx, num) for idx, num in enumerate(l)],
    key=lambda x: (x[0], x[1])
)
# 提取排序后的数值
result = [item[2] for item in sorted_items]
print(*result)

方案二(简洁,无重复数值时可用)

n = int(input())
l = list(map(int, input().split()))
# 排序key为(二进制0的个数, 元素原始索引)
sorted_l = sorted(l, key=lambda num: (bin(num)[2:].count('0'), l.index(num)))
print(*sorted_l)

修正逻辑说明

  • 使用enumerate获取每个元素的原始索引,确保排序时,相同0个数的元素按输入顺序排列。
  • 排序的key参数指定优先级:先按二进制0的个数升序,再按原始索引升序,完全符合需求。

内容的提问来源于stack exchange,提问作者BADHRINATH R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:46:15