因为我不熟悉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
。有人可以回答我的问题吗?
答案 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)(但还没有完成计算)。