KeyError: при использовании функции make_small_graph в сетиx - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь поиграться с графиками из сетиx. Я пишу на Python и имею необходимые расширения. Кодовый блок:

gr = {"0": ["4"],
    "1": ["3"],
    "2": ["2", "3", "4", "5"],
    "3": ["1", "3"],
    "4": ["3"],
    "5": ["4"]
    }  
msg = nx.make_small_graph(gr)

но я получаю эту ошибку:

Traceback (последний последний вызов):

Файл "C: \ eclipse-workspace \ graohToJSON \ GraphToJSON.py", строка 16, в

msg = nx.make_small_graph(gr) #Make Small Graph

Файл "C: \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ networkx \ generators \ small.py", строка 90, в make_small_graph

ltype = graph_description[0]

KeyError: 0

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Я думаю, что Sparky05 имеет лучший ответ для вас - а именно, что другая команда будет обрабатывать формат, который вы пытаетесь использовать (хотя я бы порекомендовал использовать int вместо строк).

Этот ответ объясняет, что не так со структурой, которую вы использовали.

Из документации для make_small_graph:

make_small_graph (graph_description, create_using = None)

graph_description - это список вида [ltype,name,n,xlist]

Здесь ltype - это один из "adjacencylist" или "edgelist", name - это имя графа и n - количество узлов. Это создает график из n узлов с целочисленными метками 0,..,n-1.

Если ltype = "adjacencylist", то xlist - это список смежности с ровно n записями, в котором j-я запись (которая может быть пустой) указывает узлы, связанные с вершиной j.

... Используйте аргумент create_using, чтобы выбрать класс / тип графика.

Итак, вы ввели gr, который является диктатом, ключи которого являются строками. Но он ожидает чего-то совсем другого: список, для которого gr[0] должен быть либо "adjacencylist", либо "edgelist", а другие элементы которого дают другую информацию о графике.

Таким образом, вы должны сделать свой ввод списком, первый элемент которого сообщает формат вашей информации о структуре графа. Тогда вторым элементом вашего списка должно быть имя, которое вы даете своему графику. Следующим элементом должно быть количество узлов в вашем графике. Конечная запись должна быть либо списком ребер, либо списком, дающим узлы, смежные с каждым узлом.

Итак, как я понимаю ваше намерение, вам нужен ориентированный граф (иначе 4 будет иметь ребро также равным 0, а не просто 0, имеющее ребро 4):

gr = ['adjacencylist', 'my_graph', 6, [[4], [3], [2,3,4,5], [1,3], [3], [4]]]

G = nx.make_small_graph(gr, create_using = nx.DiGraph)

В документации показано несколько конкретных примеров, поэтому взгляните на них.

1 голос
/ 08 мая 2019

Вы можете просто создать (направленный?) Граф напрямую:

import networkx as nx

gr = {"0": ["4"],
    "1": ["3"],
    "2": ["2", "3", "4", "5"],
    "3": ["1", "3"],
    "4": ["3"],
    "5": ["4"]
    }  
msg = nx.DiGraph(gr)
print(msg.edges)
# [('3', '3'), ('3', '1'), ('2', '4'), ('2', '3'), ('2', '2'), ('2', '5'), ('4', '3'), ('1', '3'), ('5', '4'), ('0', '4')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...