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

为何这段Python奇数升序排序程序无法输出正确结果?

问题分析与解决

你的代码逻辑思路是对的,但问题出在src_arr.index(num)这个方法的使用上。list.index()会返回数组中第一个匹配该元素的索引,而不是当前循环到的元素的索引,这就导致替换操作的位置完全错误。

举个例子,输入[5, 3, 2, 8, 1, 4]时:

  1. 第一次循环到5,src_arr.index(5)返回0,替换成排序后的奇数数组[1,3,5]的第一个元素1,数组变成[1,3,2,8,1,4]
  2. 循环到1的时候,src_arr.index(1)会返回第一个出现1的索引0,而不是当前的索引4,于是把索引0的元素又替换成odd_arr[2]也就是5,数组变回[5,3,2,8,1,4]
  3. 最终整个数组看起来和输入完全一致,就是因为错误的替换位置把之前的修改又覆盖回去了。

修复后的代码

不要遍历数组元素,而是遍历数组的索引,这样就能精准定位到当前奇数的位置:

def sort_array(src_arr):
    odd_arr = sorted([num for num in src_arr if num % 2 != 0])
    i = 0
    # 遍历索引而不是元素
    for idx in range(len(src_arr)):
        if src_arr[idx] % 2 != 0:
            src_arr[idx] = odd_arr[i]
            i += 1
    return src_arr

print(sort_array([5, 3, 2, 8, 1, 4]))  # 输出:[1, 3, 2, 8, 5, 4]

或者用更简洁的生成器写法,逐个取出排序后的奇数进行替换:

def sort_array(src_arr):
    odds = iter(sorted(num for num in src_arr if num % 2 != 0))
    return [next(odds) if num % 2 != 0 else num for num in src_arr]

这两种写法都能正确保持偶数位置不变,同时将奇数升序替换到对应位置。

内容的提问来源于stack exchange,提问作者AB B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:17:32