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

时间:2015-02-01 16:45:23

标签: python list python-3.x

因为我不熟悉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)

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

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

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

6 个答案:

答案 0 :(得分:3)

尝试这样:

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

注意永远不要在迭代时修改列表

答案 1 :(得分:2)

您的问题的真正答案(其他答案都没有解决)是每次删除项目时,索引i都会移过它。

在你的情况下:

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

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

关于注释从不修改循环中的列表,尝试实现in-place algorithm之类的Fisher-Yates而不修改列表。 从不从不了解您正在做什么

答案 2 :(得分:2)

使用while循环和remove方法:

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

while 1 in a:
    a.remove(1)

print a

答案 3 :(得分:0)

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

>>> 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]

答案 4 :(得分:0)

您可以复制a然后删除但是您不能迭代并删除同一列表中的元素,如果您的列表以n元素开头,则python会有n指向每个元素的指针因此,当您迭代它时,从列表中删除元素将导致错过元素.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]

你也可以使用reverse返回和迭代器,避免一次创建列表的整个副本:

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的单次传递的线性操作。

答案 5 :(得分:0)

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)(但还没有完成计算)。