如何在Python中从列表中删除偶数?

3
我试图从一个列表中删除偶数。我的最终输出是[4, 8],但应该是空的。
list = [2, 4, 6, 8, 10]
for i in list:
    divid = i %2
    if divid == 0 :
        list.remove(i)
print(list)

5
你正在遍历列表的同时修改它。 - Holloway
5个回答

4
您正在迭代修改列表。想象一下指针沿着列表移动。对于第一次迭代,索引为 0(i 为 2)。您删除了第一个值并返回到循环的开头。

索引增加(到1),i现在是列表中的第二个值(现在是6),也被删除。请注意,4现在“落后”于迭代器的索引,永远不会被访问到。继续沿着列表走,您将删除每个第二个值,只剩下[4,8]

几个提示。要像这样循环遍历列表,您可以使用for i in list[:]:复制列表然后迭代它。还要避免将变量命名为list之类的名称,这会覆盖内置类型。这将导致代码后面出现错误。


3

正如其他人所指出的那样,您不应该同时修改列表并迭代它。最简单的解决方案是创建一个带有所需修改的新列表:

lst = [2, 4, 6, 8, 10]
new_lst = [i for i in lst if i % 2 != 0]

上述代码使用列表推导式创建一个新的列表,只包含奇数元素——这等同于从原始列表中移除偶数元素。

2
可以直接使用 if i % 2 而不是显式检查 != 0 - Holloway

3

如果你想使用你的代码,你需要遍历原始列表的 副本

在你的代码中发生了什么,你正在遍历一个列表中的项目,并从中删除项目。for循环将从它停留的索引继续迭代。但是如果你从列表中删除了一个项目,你已经将你的项目移动到idx-1,因此它会“跳过”列表中的一些项目。

list = [2, 4, 6, 8, 10]
for i in list.copy():
    divid = i %2
    if divid == 0 :
        list.remove(i)
print(list)

输出:

[]

0
for i in lst:
    if i % 2 != 0:
        new_lst.append(i)

0

这是因为您正在从您正在迭代的相同列表中删除该项。使用lambda函数,例如:

arr = [2, 4, 6, 8, 10]
print(list(filter(lambda x: x % 2, arr)))

相反,这将是实现它的最简单方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接