【问题标题】:Path Finder code, __getitem__ TypeError路径查找器代码,__getitem__ TypeError
【发布时间】:2017-05-15 13:57:02
【问题描述】:

我正在尝试做一个“路径查找器”

def find_all_paths(start, end, graph, path=[]):
    path = path + [start]
    if start == end:
        return [path]
    paths = []
    for node in graph[start]:
        if node not in path:
            newpaths = find_all_paths(graph, node, end, path)
            for newpath in newpaths:
                paths.append(newpath)
    return paths


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

如果我在 shell 中输入 find_all_paths(2,5,graph) 我应该取回从图形字典中的键 2 到 5 值的所有路径 一个正确的结果应该是这样的

path=[[2,5],[2,3,4,5][2,4,5]]

代码不断给出值错误,例如

   for node in graph[start]:
TypeError: 'int' object has no attribute '__getitem__'

有人可以帮我把这个东西运行起来

【问题讨论】:

  • 您应该避免使用像list 这样的可变值来初始化参数。请参阅《Python 漫游指南》中的 Common Gotchas
  • 使用 print() 检查您在 graph 中的内容 - 似乎您分配的是单个数字而不是列表或目录。
  • 递归调用错误:传递的参数不尊重参数。替换为:newpaths = find_all_paths(node, end, graph, path).

标签: python python-2.7 typeerror


【解决方案1】:

有几个尴尬和错误:

不要使用列表初始化 path 参数,而是使用None。 并在函数体中创建空列表。

def find_all_paths(start, end, graph, path=None):
    path = path or []

传递给find_all_paths 的值不尊重签名。 改为这样写:

newpaths = find_all_paths(node, end, graph, path)

由于值是整数,因此图表必须包含 int 而不是 strings

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

这是您的代码的固定版本:

def find_all_paths(start, end, graph, path=None):
    path = path or []
    path.append(start)
    if start == end:
        return [path]
    paths = []
    for node in graph[start]:
        if node not in path:
            newpaths = find_all_paths(node, end, graph, path)
            for newpath in newpaths:
                paths.append(newpath)
    return paths

如果你试试这个:

graph = {1: [2], 2: [3, 4, 5], 3: [4], 4: [5, 6], 5: [], 6: []}
print(find_all_paths(2, 5, graph))

你会得到:

[[2, 3, 4, 5, 6]]

【讨论】:

  • 使用path.append(start) 代替path = path + [start] 会破坏算法,不幸的是,因为它修改了调用者的路径副本。如果还原此更改,它将与发布者的“正确”答案 ([[2, 3, 4, 5], [2, 4, 5], [2, 5]]) 匹配。
  • 伟大的代码毫无疑问,但不是我之前所说的我正在寻找的路径,我希望它类似于 path=[[2,5],[2,3,4,5] [2,4,5]] 它应该显示您显示的每个可用路径 [[2, 3, 4, 5, 6]] 但 6 与他的组无关
  • @Enigma 好吧,由你来实现正确的算法……
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多