小能豆

Python:使用for循环将所有零移动到末尾

python

我希望有人也能帮助我解决这个问题。我正在尝试解决同样的问题,尽管我正在尝试使用 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 循环来做到这一点。


阅读 80

收藏
2023-05-29

共1个答案

小能豆

在您的代码中,出现问题的原因是在遍历列表lst的同时,您修改了列表的长度,导致遍历过程中的索引出现错误。

在每次循环中,当您找到一个值为0的元素时,您使用lst.remove(i)语句从列表中移除该元素。这会导致列表的长度发生变化,并且后续的索引会向前移动。由于您同时使用了for i in lst的循环,循环索引的位置无法正确地跟踪列表的变化,导致提前结束循环。

为了解决这个问题,一种方法是创建一个新的列表new_lst,在遍历原始列表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_lstzeros连接在一起,以得到正确顺序的结果列表。

通过这种方法,您可以使用循环来移除零值,并保持正确的顺序。

2023-05-29