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

6.13 LAB:列表过滤排序代码为何未完全移除负数?

问题原因分析

你遇到的问题出在遍历列表的同时修改列表的操作上。当你在for item in nums循环里调用nums.remove(item)时,列表的长度和元素位置会动态变化,导致部分元素被跳过,没被检查到。

举输入-1 -7 -2 -88 5 -6对应的初始nums列表[-1, -7, -2, -88, 5, -6]为例,遍历过程如下:

  • 第一次循环取到-1,满足负数条件,执行remove,列表变成[-7, -2, -88, 5, -6]。
  • 第二次循环本应取原列表的第二个元素,但因为列表已缩短,循环指针直接指向新列表的第二个位置(原第三个元素-2),跳过了现在位于第一个位置的-7。
  • 处理完-2后列表变成[-7, -88, 5, -6],接下来循环指针指向新列表的第三个位置(元素5),跳过了-7和-88。
  • 最后处理到-6并移除,但剩下的-7和-88已不在后续遍历范围内,所以留在了列表里。
修复方案

推荐两种更安全的写法:

方案1:使用列表推导式(最简洁)

直接生成只包含非负整数的新列表,避免在原列表上修改:

user_input = input()
numbers = user_input.split()
nums = [int(num) for num in numbers if int(num) >= 0]
nums.sort()
for x in nums:
    print(x, end=' ')

方案2:倒序遍历原列表

倒序遍历的时候,删除前面的元素不会影响后续遍历的元素位置:

user_input = input()
numbers = user_input.split()
nums = [int(num) for num in numbers]
# 倒序遍历索引
for i in range(len(nums)-1, -1, -1):
    if nums[i] < 0:
        nums.pop(i)
nums.sort()
for x in nums:
    print(x, end=' ')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:15:42