在 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)(但还没有做计算)。
因为我是 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)(但还没有做计算)。