关键:字典的值一旦弹出就不会插入?

我正在尝试检查删除节点后Graph是否保持循环。在这种尝试中,我弹出一个键并检查是否删除该节点会删除所有循环。但是也许在第一次弹出之后,弹出的元素没有被插入

def detectCycle(v,visited,parent):
    visited[v]=True
    for i in Graph[v]:
        if(visited[i]==False):
            if(detectCycle(i,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,-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
hateheart 回答:关键:字典的值一旦弹出就不会插入?

x = Graph.pop(i)行,其中i = 1(第一次迭代)从
中删除了键(1)。 字典。这就是为什么您遇到关键错误的原因。
尝试改用x = Graph[i]吗?
或者,如果您需要在密钥不存在的情况下获得-1的逻辑,请使用:
x = Graph.get(i,-1)

,

这是一个场景。 您从1中删除了密钥Graph,并遍历了字典的其余部分。 Graph[2]的值为[5,1,3,4] 现在,您遍历[5,4]并使用这些键检查Graph Graph[5]的值为[1,2] 现在遍历[1,2]并使用这些键检查图将为您提供KeyError,因为Graph[1]不存在。 我对函数detectCycle进行了更改,以检查密钥是否存在。 还进行了更改,以基于注释返回调用的函数。

Graph={1: [5,2],2: [5,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,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,-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)
本文链接:https://www.f2er.com/3168670.html

大家都在问