我希望有人也能帮助我解决这个问题。我正在尝试解决同样的问题,尽管我正在尝试使用 for 循环和 python 内置函数,如下所示。
def move_zeros(lst): new_ls = [] for i in lst: if i == 0: new_ls.append(i) lst.remove(i) return (lst) samp_lis = [9, 0, 0, 9, 1, 2, 0, 1, 0, 1, 0, 3, 0, 1, 9, 0, 0, 0, 0, 9] print(move_zeros(samp_lis))
然而,无论出于何种原因,for 循环在结束之前只到达索引 13。有人可以向我解释为什么这样做吗?无论我做什么,我似乎都无法让 for 循环继续下去
[9, 0, 0, 9, 1, 2, 0, 1, 0, 1, 0, 3, 0, 1, 9, 0 , 0, 0, 0, 9 ]
以下是我不断得到的答案
[9, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]
之前已经问过同样的答案,但是,看起来每个人都采用了排序方法。我想知道是否可以使用 for 循环来做到这一点。
在您的代码中,出现问题的原因是在遍历列表lst的同时,您修改了列表的长度,导致遍历过程中的索引出现错误。
lst
在每次循环中,当您找到一个值为0的元素时,您使用lst.remove(i)语句从列表中移除该元素。这会导致列表的长度发生变化,并且后续的索引会向前移动。由于您同时使用了for i in lst的循环,循环索引的位置无法正确地跟踪列表的变化,导致提前结束循环。
lst.remove(i)
for i in lst
为了解决这个问题,一种方法是创建一个新的列表new_lst,在遍历原始列表lst时,将非零的元素添加到new_lst中,然后在循环结束后将零值添加到new_lst中。这样可以避免在循环过程中修改列表的长度。
new_lst
以下是修改后的代码示例:
def move_zeros(lst): new_lst = [] zeros = [] for i in lst: if i != 0: new_lst.append(i) else: zeros.append(i) return new_lst + zeros samp_lst = [9, 0, 0, 9, 1, 2, 0, 1, 0, 1, 0, 3, 0, 1, 9, 0, 0, 0, 0, 9] print(move_zeros(samp_lst))
运行上述代码会得到以下输出:
[9, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9]
在修改后的代码中,我们将非零值添加到new_lst列表中,将零值添加到zeros列表中。最后,我们将new_lst和zeros连接在一起,以得到正确顺序的结果列表。
zeros
通过这种方法,您可以使用循环来移除零值,并保持正确的顺序。