我正在使用集合进行一种图形遍历。
我有一个nodedict(set)节点键,该组包含图中关键节点有边缘的其他节点。
在我的遍历中,我查找给定节点的两个不同边。如果它们通过边缘连接,我将它们断开连接。如果它们未连接,我将它们连接起来并断开它们与当前节点的连接。类似的东西:
for e1 in edgemap[curr]:
for e2 in edgemap[curr]:
if e1 != e2:
if e1 in edgemap[e2]:
edgemap[e2].remove(e1)
edgemap[e1].remove(e2)
else:
edgemap[e1].add(e2)
edgemap[e2].add(e1)
edgemap[curr].remove(e1)
edgemap[curr].remove(e2)
当然,这段代码根本不起作用。我在迭代期间修改了一个集合。通常,当我想进行修改时,我会迭代edgemap [_] .copy()。 但是,在这种情况下,我实际上希望修改立即生效..所以如果" else"条件已执行,使用此设计,我们需要打破for循环并重新开始。
目前我想我会用这个:
while 1:
match = False
for e1 in edgemap[curr].copy():
for e2 in edgemap[curr].copy():
if e1 != e2:
match = True
if e1 in edgemap[e2]:
edgemap[e2].remove(e1)
edgemap[e1].remove(e2)
else:
edgemap[e1].add(e2)
edgemap[e2].add(e1)
edgemap[curr].remove(e1)
edgemap[curr].remove(e2)
edgemap[e1].remove(curr)
edgemap[e2].remove(curr)
break
if match:
break
但我仍然是一个初学程序员......这感觉真的很尴尬。有没有更好的方法可以设计它?