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]