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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:03:29