2016-12-31 3 views
0

Я пытаюсь сделать «Path Finder»Path код Finder, __getitem__ TypeError

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: []} 

вхожу 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__' 

может кто-то пожалуйста, помогите мне получить эту вещь работает

+0

Вы должны избегать инициализации параметр с изменяемым значением, например 'list'. См. [Common Gotchas] (http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments) в руководстве The Hitchhiker для Python! –

+0

используйте 'print()', чтобы проверить, что у вас есть в 'graph' - кажется, вы назначаете одиночный номер вместо списка или каталога. – furas

+0

Рекурсивный вызов неверен: переданные аргументы не учитывают параметры. Замените следующим: 'newpaths = find_all_paths (node, end, graph, path)'. –

ответ

2

Есть несколько неловкости и ошибки:

Вместо инициализации пути параметра со списком, используйте 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]] 
+1

Использование 'path.append (start)' вместо 'path = path + [start]' ломает алгоритм, к сожалению, поскольку он изменяет копию пути вызывающего. Если это изменение будет отменено, оно будет соответствовать «правильному» ответу плаката ('[[2, 3, 4, 5], [2, 4, 5], [2, 5]]'). –

+0

отличный код без сомнения, но не путь, который я ищу, как я уже говорил ранее, хочу, чтобы это было что-то вроде пути = [[2,5], [2,3,4,5] [2,4,5] ] Предполагается показать каждый доступный путь ваш показал [[2, 3, 4, 5, 6]], но 6 не связан с его группой – Enigma

+0

@Enigma Хорошо, решать вам правильный алгоритм ... –

Смежные вопросы