Python排序列表正数前置时,pop操作触发IndexError索引越界问题
问题解决:仅排序正整数并保持非正元素顺序
问题场景
需求是:对列表中的正整数单独排序,将排序后的正整数放在负数和零的前面,同时保持负数和零的原有顺序。但编写的代码在移除原列表中的正整数时触发了IndexError: list index out of range,错误出现在第二个for循环的if nums[i]>0语句处。
原代码:
# sort only positive numbers def solve(n, nums): positive = [] for i in range(n): if nums[i] > 0: positive.append(nums[i]) positive.sort() for i in range(n): if nums[i] > 0: nums.pop(i) nums = positive + nums return nums arr = list(map(int, input("Enter array separated by spaces.").split())) length = len(arr) print(solve(length, arr))
错误原因
第二个for循环用原始列表长度n遍历索引,但执行nums.pop(i)时,列表长度会不断缩短。比如原列表长度是5,当你pop掉2个元素后,列表长度变成3,但循环还会继续到i=4,此时nums[i]就会超出列表索引范围,触发报错。另外,pop操作会让后续元素前移,导致部分正整数被跳过,无法被正确移除。
修正方案
不需要在原列表上删除元素,直接生成仅包含非正整数的新列表,再和排序后的正整数列表拼接即可,逻辑更简洁,也避免了索引问题:
def solve(nums): # 分离正整数和非正整数 positive = [num for num in nums if num > 0] non_positive = [num for num in nums if num <= 0] # 对正整数排序 positive.sort() # 拼接返回结果 return positive + non_positive arr = list(map(int, input("请输入以空格分隔的数组:").split())) print(solve(arr))
额外优化说明
- 无需传入列表长度
n,直接通过len(nums)即可获取,简化参数 - 使用列表推导式分离元素,代码更简洁高效
- 原代码中每次循环都执行
positive.sort()属于冗余操作,只需在收集完所有正整数后排序一次即可
内容的提问来源于stack exchange,提问作者morbid_coder
相关产品推荐
相关产品推荐

