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

基于二进制1计数与数值的双重规则整数列表排序实现问询

分析与优化你的整数列表排序代码

嘿,我来帮你梳理下这段代码的问题,再给出更简洁可靠的优化方案~

先说说原代码的正确性问题

  1. 意外去重不符合需求:开头的nums = list(set(nums))会自动移除列表里的重复元素,但你的需求里并没有提到要去重。比如输入[3,3,2],原代码会返回[2,3],但正确结果应该是[2,3,3],这就偏离了预期。
  2. 手动二次排序逻辑有缺陷:你手动遍历相邻元素交换的方式,只是做了一次冒泡排序的遍历,没法保证所有二进制1个数相同的元素都能按十进制升序排列。比如输入[7,5,3](这三个数二进制都有3个1),原代码处理后会得到[5,3,7],但正确的顺序应该是[3,5,7],因为只做了一次相邻交换,没完成完整的排序。

优化后的方案

其实Python的sorted函数可以直接通过自定义key元组一步实现你的排序规则,而且统计二进制1的个数也有更简洁的方法:

优化后的代码

def sort_by_binary_ones(nums):
    # 排序key是二元组:(二进制中1的个数, 十进制数值)
    # 先按1的个数升序,个数相同则按数值升序
    return sorted(nums, key=lambda x: (bin(x).count('1'), x))

为什么这样更优?

  • 去掉不必要的去重:保留原列表的重复元素,符合需求默认的行为
  • 更高效的1的个数统计:用bin(x).count('1')代替手动循环统计,代码更简洁,Python内置方法的效率也更高
  • 一次排序完成所有规则:利用sorted的key特性,元组会先比较第一个元素(1的个数),第一个元素相同时再比较第二个元素(十进制数值),完美匹配你的排序规则,避免手动排序的错误

验证示例

测试输入[1,2,3,4]:

  • 1 → 二进制1 → 1个1
  • 2 → 二进制10 →1个1
  • 3 → 二进制11 →2个1
  • 4 → 二进制100 →1个1

排序后得到[1,2,4,3],和你给出的预期结果完全一致。

再测试有重复元素的输入[3,3,2],返回[2,3,3],符合预期;测试同个数1的多元素输入[7,5,3],返回[3,5,7],也完全正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:21:54