从python中的列表中删除元素并避免转移

jam*_*mes 1 python list

我在python中有一个列表,每当元素满足特定条件时,我都会删除该元素。问题在于for循环似乎正在跳过某些元素。我认为这是因为删除后列表已移至左侧。那么如何正确删除列表中的项目呢?这是我的代码

list = [0, 0, 0, 1, 1, 0 ,0, 1, 0]

for elem in list:
    if elem == 0:
        list.remove(elem)

print(list)
Run Code Online (Sandbox Code Playgroud)

这就是结果 [1, 1, 0, 1, 0]

Ale*_*der 9

在迭代列表时,您不应删除元素或向列表中添加元素。这里有一些选择。

方法1: 创建一个新的筛选列表。

[x for x in my_list if x != 0]
Run Code Online (Sandbox Code Playgroud)

方法2: 如果项目为布尔值,则可以使用filter

list(filter(lambda x: x, my_list))  # or lambda x: x != 0 depending on intent.
Run Code Online (Sandbox Code Playgroud)

方法3: 创建要删除的项目的索引,然后再将其删除。

idx = [n for n, x in enumerate(my_list) if x == 0]
for i in reversed(idx):
    my_list.pop(i)
Run Code Online (Sandbox Code Playgroud)

方法4: 根据Alex Martelli在相关问题中的解决方案

my_list[:] = [x for x in my_list if x != 0]
Run Code Online (Sandbox Code Playgroud)

这将分配给与my_list变量名称匹配的列表切片,从而保留对该变量的任何现有引用。

  • 您甚至可以跳过“!= 0”,因为当“如果”被使用时,“ 0”的计算结果为“假”。 (2认同)