如何使用Python在循环中正确地从数组中删除元素

3

我尝试从一个数组中仅删除一个元素,并在循环中打印剩余的元素:

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

所以我期望它打印出这个:
[2, 3, 4, 5]
[1, 3, 4, 5]
[1, 2, 3, 5]
[1, 2, 3, 4]

为什么我得到了以下结果:
[2, 3, 4, 5]
[2, 4, 5]
[2, 4]

a = arr does not create a copy of arr - presumably you just need a = arr[:] - AChampion
1
可能是在迭代时从列表中删除项目的重复问题。 - eyllanesc
1
我不太确定这是否是一个重复的问题,因为这个问题正在询问如何从数组中_暂时_删除一个元素(实际上意味着_不_真正删除该元素),而另一个问题则是询问如何_永久_删除一个元素。 - David Z
4个回答

4
这是一个经典的深拷贝与浅拷贝问题。 Python通过引用复制数组。因此,对新变量(在您的情况下为a)所做的任何更改都将反映在主数组(arr)中。从a中删除元素也会从arr中删除元素。 您需要使用以下代码来创建副本。
 a = arr[:] 

这不会从 arr 中删除任何元素。


不太确定关于“深度”复制部分。这些项目是整数,因此它们是不可变的。浅层的std副本可能会产生相同的效果,因为在这种情况下我们只关心容器对象。注意:当我谈论“深度”时,我指的是“copy”模块中使用的术语。你的是一个浅层副本——如果它包含列表,例如,在之后你仍然会修改相同的项目。 - JL Peyret

0

你已经有了解释,我提供一个替代方案 - 你可以在完全不使用remove的情况下生成所需的输出:

arr = [1,2,3,4,5]
for i in arr:
    a = [x for x in arr if x != i]
    print a

(注意arr中的非唯一元素,如果有任何非唯一元素,那么这段代码和你的代码都会产生意外的结果,尽管方式不同)。


0
你可以试试这个。
arr = [1, 2, 3, 4, 5, 6, 7 ]
for index, item in enumerate(arr):
    print(arr[0:index] + arr[index+1:])

我认为这可以帮助你。

如果你没有任何重复的值,你也可以使用这个方法。

for item in arr:
   print(set(arr) - set([item]))

0

Python列表是可变的,即对它们进行修改操作(如list.remove())不会产生新的列表,而是修改现有的列表,因此每个循环实际上都会永久修改源列表并且元素会丢失。如果要实现您想要的效果,您需要每次想要修改它时复制整个列表,或者可以创建一个排除了元素的新列表,或者对于非常长的列表,通过切片重构可能是最有效的方法:

arr = [1,2,3,4,5]
for i in range(len(arr)):
    a = arr[0:i] + arr[i+1:]
    print(a)

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