Python列表唯一数按原序返回 两位数处理bug修复
长列表按原序返回唯一数字的Bug修复
需求说明
- 输入:空格分隔的数字列表
- 输出:列表中所有仅出现1次的元素,输出顺序和元素在原始列表中的出现顺序完全一致
- 问题表现:此前的代码存在逻辑漏洞,无法正确处理包含两位数的输入场景,输出结果错误
原有错误代码
a = [int(s) for s in input().split()] sortedLst = sorted(a) unique = [] uniqueOrd = [] for i in range(len(a) - 2): if sortedLst[i + 1] != sortedLst[i] and sortedLst[i + 1] != sortedLst[i + 2]: unique.append(sortedLst[i + 1]) for num in a: if num in unique: uniqueOrd.append(num) print(*uniqueOrd)
错误原因
所谓“无法处理两位数”只是表象,核心问题是排序后校验唯一值的逻辑存在严重边界缺失:
- 循环范围设置错误,永远不会校验排序后列表的第一个元素和最后一个元素,如果唯一值出现在首尾位置,会直接被漏掉
- 当输入列表长度小于3时,循环完全不会执行,直接返回空结果
- 用列表存储唯一值做成员判断,长列表下性能较差
修复方案
优先选择计数法实现,逻辑简单无边界问题,和数字位数完全无关,性能更优:
a = [int(s) for s in input().split()] # 统计每个数字出现次数 count = {} for num in a: count[num] = count.get(num, 0) + 1 # 按原顺序收集仅出现一次的数字 res = [num for num in a if count[num] == 1] print(*res)
如果需要沿用原代码的排序比较思路,需要补全首尾元素的判断逻辑,修正后代码如下:
a = [int(s) for s in input().split()] if len(a) == 1: print(a[0]) exit() sortedLst = sorted(a) unique = set() n = len(sortedLst) # 校验首位元素 if sortedLst[0] != sortedLst[1]: unique.add(sortedLst[0]) # 校验中间元素 for i in range(1, n-1): if sortedLst[i] != sortedLst[i-1] and sortedLst[i] != sortedLst[i+1]: unique.add(sortedLst[i]) # 校验末位元素 if sortedLst[-1] != sortedLst[-2]: unique.add(sortedLst[-1]) # 按原序输出 res = [num for num in a if num in unique] print(*res)
内容的提问来源于stack exchange,提问作者Meno
相关产品推荐
相关产品推荐

