我很困惑为什么这个简短的代码段无法从列表中删除特定的对:
g = [[7, 11], [7, 8], [3, 10], [3, 8], [8, 9], [11, 10], [11, 2],
[11, 9]]
u = 3
g_cpy = g
for e in g_cpy:
if u == e[0]:
g.remove(e)
print g
它不会删除条目[3,8],但是会删除[3,10]。我想念什么?
答案 0 :(得分:0)
我认为未删除[3, 8]
的原因是
您删除了数组中的第3个元素,e将成为g_cpy
中的第4个元素。
您已经删除了[3, 10]
中的g_cpy
,所以g_cpy
的第四个元素将是[8, 9]
而不是[3, 8]
,这就是[3, 8]
是未被删除。
如果您复制g_cpy = g
之类的列表,它将仅复制内存地址。因此,它们都将指向同一对象。如果您删除g
中的项目,则g_cpy
中的项目也会被删除。
如果要避免此问题,请复制列表g_cpy = g[::]
。它将复制入口对象到其他内存,而不仅仅是复制内存地址。
答案 1 :(得分:0)
g_cpy = g
不会创建列表的副本,而只是创建对同一对象的引用,然后在迭代过程中对其进行修改。另一个问题是,重复的remove
调用在时间复杂度方面很糟糕(每个调用都是O(N)
)。最好使用一种理解从头开始构建新列表(总体线性复杂度)。您仍然可以使用该技术 并通过切片分配来对原始列表进行变异:
g[:] = [e for e in g if u != e[0]]