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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:19:58