Ключ: значение словаря не вставляется, как только выскочил? - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь проверить, остается ли график циклическим после удаления узла. В этой попытке я нажимаю клавишу и проверяю, удаляет ли этот узел все циклы или нет. Но, возможно, после первого всплывающего окна извлеченный элемент не вставляется

def detectCycle(v,visited,parent):
    visited[v]=True
    for i in Graph[v]:
        if(visited[i]==False):
            if(detectCycle(i,visited,v)):
                return True
        elif parent!=i:
            return True
    return False

def isCyclic():
    visited=[False for i in range(N+1)]
    for i in Graph.keys():
        if(visited[i]==False):
            if(detectCycle(i,visited,-1)==True):
                return True
    return False


Graph={1: [5, 2], 2: [5, 1, 3, 4], 3: [2], 4: [2], 5: [1, 2]}
N=len(Graph.keys())
flag=0
for i in range(1,N+1):            
        x=Graph.pop(i)
        if(isCyclic()):
            pass
        else:
            flag=1
            break
        Graph[i]=x
if(flag==1):
        print(i)
else:
        print(-1)

Я ожидаю, что узел, удаляющий цикл, удаляется, и если такой узел не существует, такой узел -1 не возвращается, как бы то ни было,

Traceback (most recent call last):
    for i in Graph[v]:
KeyError: 1

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Вот сценарий. Вы удалили ключ 1 из Graph и перебрали остальную часть словаря. Graph[2] имеет значение [5,1,3,4] Теперь вы выполняете итерацию по [5,1,3,4] и проверяете График с этими ключами Graph[5] имеет значение [1,2] Теперь итерируете по [1,2] и проверка Графика с этими ключами даст вам KeyError поскольку Graph[1] не существует. Я внес изменение в функцию detectCycle, чтобы проверить, существует ли ключ. Также внесено изменение для возврата вызванной функции на основе комментария.

Graph={1: [5, 2], 2: [5, 1, 3, 4], 3: [2], 4: [2], 5: [1, 2]}
def detectCycle(v,visited,parent):
    visited[v]=True
    if v in Graph:
        for i in Graph[v]:
            if(visited[i]==False):
                return detectCycle(i,visited,v)
            elif parent!=i:
                return True
    return False

def isCyclic():
    visited=[False for i in range(N+1)]
    for i in Graph.keys():
        if(visited[i]==False):
            return detectCycle(i,visited,-1)
    return False

N=len(Graph.keys())
flag=0
for i in range(1,N+1):            
    x=Graph.pop(i)
    if(isCyclic()):
        pass
    else:
        flag=1
        break
    Graph[i]=x

if(flag==1):
    print(i)
else:
    print(-1)
0 голосов
/ 04 ноября 2019

Строка x = Graph.pop(i), где i = 1 (первая итерация) удаляет ключ (1) из словаря
. Вот почему вы получаете ошибку ключа.
Попробуйте вместо этого использовать x = Graph[i]?
Или, если вам нужна логика получения -1, если ключ не существует - используйте:
x = Graph.get(i, -1)

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