深度优先在python中搜索错误:密钥错误7

时间:2014-04-04 14:40:11

标签: python algorithm

enter image description here

我已经编写了以下python程序来执行给定图形的 DFS ,但在执行后它会给出错误:键错误7 。我的代码出了什么问题?

output=[]
graph = {
            9:[8,7,6],
            8:[5,4],
            6:[3,2],
            5:[1,0]
        }

def dfs(graph,root):
    stack=[]
    visited=set()

    stack.append(root)
    output.append(str(root))
    visited.add(root)

    while not(stack==[]):
        for item in graph[root]:

            if item not in visited:
                stack.append(item)
                visited.add(item)
                output.append(str(item))

            if set(graph[item]).union(visited)==visited:
                stack.pop(-1)
                root=stack[len(stack)-1]
                continue

            root=item

dfs(graph,9)
print(" ".join(output))

在添加@amit给出的建议后仍然没有解决问题我编写了以下代码并且输出错误,请帮忙!

output=[]
graph = {
           1:[2,3],
           2:[4,5],
           3:[6,7],
           4:[],
           5:[],
           6:[],
           7:[]
        }

def dfs(graph,root):
    stack=[]
    visited=set()

    stack.append(root)
    output.append(str(root))
    visited.add(root)

    while not(stack==[]):
        for item in graph[root]:

            if item not in visited:
                stack.append(item)
                visited.add(item)
                output.append(str(item))

            if set(graph[item]).union(visited)==visited:
                stack.pop(-1)
                if not(stack==[]):
                    root=stack[len(stack)-1]
                else:
                    break
                continue

            root=item

dfs(graph,1)
print(" ".join(output))

3 个答案:

答案 0 :(得分:5)

您的图表实现没有以d_out(v)=0为键的节点。

所以,在这一行:

        if set(graph[item]).union(visited)==visited:

当您将7(或4)作为item时,您尝试访问graph[7] - 但没有这样的密钥。

您可以通过更改图表实现以使所有键(包括没有外边缘的键)具有key:[],或者通过添加检查条件来检查是否item来克服它在尝试访问它之前,它位于graph

答案 1 :(得分:1)

您没有定义从顶点编号7开始的边缘。

答案 2 :(得分:0)

可能是由于缺少索引值或列序列号。 您可以做的是可以在数据框中添加索引列,然后使用pandas iloc语法遍历每一行。 例如:df.iloc ['索引号']。列名