Python初学者求助:编写将数组中所有零移至末尾且保留非零元素顺序的算法
解决Python数组移零问题的正确姿势
首先,咱们来拆解下你代码里的几个关键问题:
- 判断条件错配:你写的是
array[i] == "0",但需求里的零是整数0,不是字符串"0",这会导致真正的整数0根本不会被统计和处理 - 循环中修改数组的坑:在
for循环里调用array.remove(0)会出问题——remove()会删除数组中第一个匹配的0,而非你当前循环到的那个;而且每次删除元素后数组长度变短,循环的range(length)是固定的原长度,这会导致索引错位,直接跳过部分元素 - 追加错误类型的零:最后你append的是字符串"0",但需求是要整数0,结果会变成混合类型数组,不符合预期
那咱们来修复这些问题,先给你一个贴合你原有思路的修正版代码:
def move_zeros(array): zero_count = 0 # 先收集所有非零元素,避免循环中修改原数组的索引问题 non_zero_elements = [] for num in array: if num == 0: zero_count += 1 else: non_zero_elements.append(num) # 把统计好的整数零追加到末尾 non_zero_elements.extend([0] * zero_count) return non_zero_elements
如果你想要更简洁高效的写法,用列表推导式一行就能搞定(可读性也拉满):
def move_zeros(array): # 先筛选所有非零元素,再补充对应数量的整数零 non_zero = [x for x in array if x != 0] return non_zero + [0] * (len(array) - len(non_zero))
测试你给的例子试试:
print(move_zeros([1, 0, 1, 2, 0, 1, 3])) # 输出:[1, 1, 2, 1, 3, 0, 0]
完全符合你的需求~
额外补充:如果你的数组里可能出现其他假值(比如None、False),但你只想移动整数0的话,可以把判断条件改成isinstance(x, int) and x == 0,不过一般场景下x != 0就足够用啦。
内容的提问来源于stack exchange,提问作者hello
相关产品推荐
相关产品推荐

