2016-10-17 9 views
1

Как исключение KeyError: 3 при попытке выполнить следующие действия, чтобы найти топологическую сортировку:Получение KeyError: 3

def dfs_topsort(graph):   # recursive dfs with 
    L = []      # additional list for order of nodes 
    color = { u : "white" for u in graph } 
    found_cycle = [False] 
    for u in graph: 
     if color[u] == "white": 
      dfs_visited(graph, u, color, L, found_cycle) 
     if found_cycle[0]: 
      break 

    if found_cycle[0]:   # if there is a cycle, 
     L = []     # then return an empty list 

    L.reverse()     # reverse the list 
    return L      # L contains the topological sort 


def dfs_visited(graph, u, color, L, found_cycle): 
    if found_cycle[0]: 
     return 
    color[u] = "gray" 
    for v in graph[u]: 
     if color[v] == "gray": 
      found_cycle[0] = True 
      return 
     if color[v] == "white": 
      dfs_visited(graph, v, color, L, found_cycle) 
    color[u] = "black"  # when we're done with u, 
    L.append(u) 

graph_tasks = {1: [2,11], 
    2: [3], 
    11: [12], 
    12: [13] 
    } 
order = dfs_topsort(graph_tasks) 

for task in order: 
    print(task) 

Я получаю KeyError: 3 для приведенного выше примера. Почему это так? Как это можно исправить?

ответ

0

Кажется, что для алгоритма dfs_topsort требуется key для каждого value, который существует на графике.

Поэтому нам нужно включить ключи для каждого из значений. Первый, который отсутствует, - 3, что вызвало KeyError: 3, а также 13. Если мы включим эти ключи и дадим им пустые значения (потому что они не подключены к каким-либо другим узлам), то он исправляет ошибку.

Кроме того, другой пример, который вы дали в комментарии, работает, потому что каждое значение (правая сторона) ([2,3], [4, 5, 6], [4, 6], [5, 6], [6], []) также находится в значениях ключа (левая сторона) [1, 2, 3, 4, 5, 6].

Таким образом, используя graph_tasks = { 1: [2, 11], 2: [3], 3: [], 11: [12], 12: [13], 13: [] }, вы получите результат, который вы ожидаете.

Надеюсь, это вам поможет.

+0

Но когда я делаю то, что вы предлагаете, dfs_topsort возвращает null. То, что я делаю, работает для других примеров, но не для этого. Как это исправить? – Angad

+0

Думаю, вам нужно изменить ту же логику в функции 'dfs_topsort': изменить' для u в графе: 'to' для u в graph.iterkeys(): '. Кроме того, он возвращает 'None' не' null', и, согласно вашим комментариям кода, «если есть цикл, а затем возвращает пустой список», значит, это не должно быть True, и оно возвращает «None»? – davedwards

+0

Нет, если я использую этот пример: graph = { 1: [2, 3], 2: [4, 5, 6], 3: [4,6], 4: [5,6], 5: [6], 6: [] }, то, что я делал, дает правильный результат. Даже после изменения его на graph.iterkey() в dfs_topsort он ничего не возвращает. – Angad