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

