迭代删除Python中的列表元素-列表理解与for循环,结果不同



给定超图的边集(python语言中的列表列表)(例如l=[[1,2,3],[2],[3],[3,4]]),任务是删除包含特定顶点(例如顶点2)的所有边。对于上面的例子,结果应该是[[3],[3,4]]。

我很难理解为什么第一个函数没有按预期工作。

def edge_delete(edge_set, v0):
    """ delete all edges containing vertex v0 """
    for edge in edge_set:
        if v0 in edge:
            edge_set.remove(edge)
    return edge_set

给出

l = [[1,2,3], [2], [3], [3,4]]
edge_delte(l, 2)
[[2], [3], [3, 4]]

我不清楚为什么删除了元素[1,2,3],但没有删除元素[2]。

下面给出了正确的结果

def edge_delete_v2(edge_set, v0):
    """ delete all edges containing vertex v0 """
    return [edge for edge in edge_set if v0 not in edge]

给出

l = [[1,2,3], [2], [3], [3,4]]
edge_delete_v2(l, 2)
[[3], [3, 4]]

第一个代码在迭代列表时试图修改列表,这可能会使迭代出错。

第二个是根本不修改列表;它正在使用它来建立一个全新的列表,其中包含不会被删除的元素。

最新更新