为何这段Python奇数升序排序程序无法输出正确结果?
问题分析与解决
你的代码逻辑思路是对的,但问题出在src_arr.index(num)这个方法的使用上。list.index()会返回数组中第一个匹配该元素的索引,而不是当前循环到的元素的索引,这就导致替换操作的位置完全错误。
举个例子,输入[5, 3, 2, 8, 1, 4]时:
- 第一次循环到
5,src_arr.index(5)返回0,替换成排序后的奇数数组[1,3,5]的第一个元素1,数组变成[1,3,2,8,1,4] - 循环到
1的时候,src_arr.index(1)会返回第一个出现1的索引0,而不是当前的索引4,于是把索引0的元素又替换成odd_arr[2]也就是5,数组变回[5,3,2,8,1,4] - 最终整个数组看起来和输入完全一致,就是因为错误的替换位置把之前的修改又覆盖回去了。
修复后的代码
不要遍历数组元素,而是遍历数组的索引,这样就能精准定位到当前奇数的位置:
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
相关产品推荐
相关产品推荐

