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
相关产品推荐
相关产品推荐

