给定超图的边集(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]]
第一个代码在迭代列表时试图修改列表,这可能会使迭代出错。
第二个是根本不修改列表;它正在使用它来建立一个全新的列表,其中包含不会被删除的元素。