Я выполняю своего рода обход графов с множествами.
У меня есть defaultdict (набор) ключей узлов, и этот набор содержит другие узлы на графе, к которому у ключа есть ребро.
В моем обходе я ищу два разных ребра данного узла. Если они соединены ребром, я их отключаю. Если они не подключены, я подключаю их и отключаю от текущего узла. Что-то вроде:
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
Но я все еще такой начинающий программист ... и это кажется очень неловким. Есть ли лучший способ сделать это?