如何修改Python代码实现列表偶数在前、奇数在后的重排需求
原代码错误点
- 判定元素为奇数后,你追加到列表末尾的是当前索引
i,不是奇数元素本身s[i],这也是你错误输出里出现0、2、4的直接原因 - 原列表里的奇数没有被移除,会同时留在列表前部
- 遍历范围写为
range(len(s)-1),会漏掉列表最后一个元素的判断 - 边遍历边修改原列表长度的逻辑本身就容易出现遍历混乱,不推荐用这种写法
最优修改方案
直接拆分偶数和奇数再合并即可,逻辑清晰时间复杂度低:
def evenorodd(s): # 分别收集所有偶数、奇数 evens = [num for num in s if num % 2 == 0] odds = [num for num in s if num % 2 != 0] # 偶数在前、奇数在后拼接返回 return evens + odds s = [1,2,3,4,5,5] print(evenorodd(s)) # 输出为 [2, 4, 1, 3, 5, 5],完全符合偶数全在奇数前的要求
注:你给出的期望输出
[0,2,2,4,4,1,3,5,5]和输入列表[1,2,3,4,5,5]的元素无法对应,应为笔误。如果确实有额外的元素规则,可以补充说明后调整逻辑。
按原有遍历思路修改的版本
如果你坚持要用遍历追加的写法,可按如下调整:
def evenorodd(s): s = list(s) origin_len = len(s) # 按原始长度遍历,避免列表变长影响遍历范围 for i in range(origin_len): if s[i] % 2 != 0: # 追加奇数元素而非索引 s.append(s[i]) # 保留前半部分的偶数,拼接后半部分追加的奇数 return [num for num in s[:origin_len] if num % 2 == 0] + s[origin_len:]
内容的提问来源于stack exchange,提问作者Joshua Bradley
相关产品推荐
相关产品推荐

