基于二进制1计数与数值的双重规则整数列表排序实现问询
分析与优化你的整数列表排序代码
嘿,我来帮你梳理下这段代码的问题,再给出更简洁可靠的优化方案~
先说说原代码的正确性问题
- 意外去重不符合需求:开头的
nums = list(set(nums))会自动移除列表里的重复元素,但你的需求里并没有提到要去重。比如输入[3,3,2],原代码会返回[2,3],但正确结果应该是[2,3,3],这就偏离了预期。 - 手动二次排序逻辑有缺陷:你手动遍历相邻元素交换的方式,只是做了一次冒泡排序的遍历,没法保证所有二进制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
相关产品推荐
相关产品推荐

