Python 从二维列表中删除行

Python 从二维列表中删除行,python,python-2.7,Python,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]。我遗漏了什么?我认为没有删除[3,8]的原因是 您删除了数组中的第3个元素,e将是g\

我不明白为什么这个从列表中删除特定对的简短片段失败了:

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]。我遗漏了什么?

我认为没有删除
[3,8]
的原因是

您删除了数组中的第3个元素,e将是
g\u cpy
中的第4个元素

您已经在
g_cpy
中删除了
[3,10]
,因此
g_cpy
的第4个元素将是
[8,9]
而不是
[3,8]
,这就是
[3,8]
未被删除的原因

如果您复制列表,比如
g_cpy=g
,它只会复制内存地址。所以它们都指向同一个物体。如果删除
g
中的项目,则
g\u中的项目也将被删除

若要避免此问题,请复制列表,如
g_cpy=g[::]
。它将条目对象复制到其他内存,而不仅仅是复制内存地址

g_cpy = g
不创建列表的副本,只创建对同一对象的引用,然后在迭代过程中修改该对象。另一个问题是重复的
remove
调用在时间复杂度方面是不好的(每个调用都是
O(N)
)。最好使用理解从零开始构建新列表(总体线性复杂度)。您仍然可以使用该技术,并通过使用切片分配来改变原始列表:

g[:] = [e for e in g if u != e[0]]

可能重复使用列表理解的可能重复:
g\u cpy=[i为i,如果i[0]!=u]