从二维列表中删除行

时间:2019-01-30 01:24:18

标签: python-2.7

我很困惑为什么这个简短的代码段无法从列表中删除特定的对:

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]。我想念什么?

2 个答案:

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