Pythonic дизайн для обработки изменения набора во время итерации - PullRequest
0 голосов
/ 05 мая 2018

Я выполняю своего рода обход графов с множествами.

У меня есть 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

Но я все еще такой начинающий программист ... и это кажется очень неловким. Есть ли лучший способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...