在 Python 3.4 中使用 for 循环从数组中删除特定元素

Using for loop in Python 3.4 to remove particular element from array

因为我是 Python 中的编程新手。我正在尝试使用 for 循环从数组中删除特定元素,看起来像

a=[2,3,1,4,1,1,1,5]
n=a.count(1)
for i in range (len(a)-n):
    if (a[i]==1):
        del a[i]
    else:
        a[i]=a[i]
print (a)

我想从数组 a 中删除 1。但是,我得到的结果是:

[2, 3, 4, 1, 1, 5]. 

也就是说 1 仍然存在于我的新数组中。有人可以回答我的问题吗?

实际上,del 语句将从您的列表中删除元素,并且由于您在循环中绑定的列表在第一次删除后没有更新,您从列表中删除了不正确的元素,所以如果你想使用 del 你需要在你的循环中创建列表名称以引用新列表,你可以为此目的使用一个函数,但是作为一种更 python 的方式你可以只使用列表理解:

>>> a=[2,3,1,4,1,1,1,5]
>>> a=[i for i in a if i !=1]
>>> a
[2, 3, 4, 5]

或者您可以使用 filter :

>>> a=[2,3,1,4,1,1,1,5]
>>> a=filter(lambda x: x !=1,a)
>>> a
[2, 3, 4, 5]

这样试试:

a = [2,3,1,4,1,1,1,5]
a = [x for x in a if x!=1]  # this is called list comprehension

注意迭代时切勿修改列表

您问题的真正答案(其他答案中 none 的答案)是每次您删除一个项目时,索引 i 都会移动过去。

你的情况:

a = [2,3,1,4,1,1,1,5]

删除原列表中的第5项后,指针移动到第6项,新的第5项(三个1序列中的第二个1)被跳过。

关于评论永远不要在循环中修改列表,尝试在不修改列表的情况下实现in-place algorithm like Fisher-Yates从不从不知道自己在做什么

使用 while 循环和 remove 方法:

a = [2, 3, 1, 4, 1, 1, 1, 5]

while 1 in a:
    a.remove(1)

print a

您可以复制 a 然后删除,但您不能遍历和删除同一个列表中的元素,如果您的列表以 n 开头,元素 python 将具有 n 指向每个元素的指针,因此在迭代它时从列表中删除元素将导致元素 missed.python 无法知道您已从列表中删除元素:

a = [2,3,1,4,1,1,1,5]
for ele in a[:]:
    if ele == 1:
        a.remove(1)
print(a)
[2, 3, 4, 5]

您还可以使用 reversed which returns 和迭代器避免一次创建列表的整个副本:

a = [2,3,1,4,1,1,1,5]
for  ele in reversed(a):
    if ele == 1:
        a.remove(1)
print(a)
[2, 3, 4, 5]

或者使用带有 [:] 语法的列表理解,这样我们实际上更新了原始对象:

a[:] = (ele for ele in a if ele != 1)

以上都是使用单次遍历的线性运算a

OP 就地更改列表,而不是创建新列表。

有两种方法,第二种安全,第一种可能更快。

a = [2, 3, 1, 4, 1, 1, 1, 5]
toremove = 1
for i in range(len(a)-1, -1, -1):
    if a[i] == toremove:
        del a[i]

a = [2, 3, 1, 4, 1, 1, 1, 5]
toremove = 1
for i in range(a.count(toremove)):
    a.remove(toremove)

第二个删除元素,无论它存在多少次(在循环之前)。由于我们没有迭代列表,因此使用 remove 方法是安全的。

两个片段都应该是O(n)(但还没有做计算)。