Словарь, содержащий все узлы и ребра графа - PullRequest
4 голосов
/ 13 апреля 2020

Мне нужно построить график из заданного списка ребер, как это:

Edges = ["cc-gc","cc-da","ee-cd","ee-bg","de-bg"]

из списка ребер выше, как мне получить график следующим образом:

graph = { "cc" : ["gc","da"],
      "gc" : ["cc"],
      "da": ["cc"],
      "ee": ["cd", "bg"],
      "cd": ["ee"],
      "de": ["bg"],
      "bg": ["de", "ee"]
    }

Ответы [ 3 ]

3 голосов
/ 13 апреля 2020

Используя networkX, мы можем построить график, разделив строки в списке и используя nx.from_edgelist, и ищем nx.neighbors каждого узла:

import networkx as nx

G = nx.from_edgelist([s.split('-') for s in Edges])

graph = dict()
for node in G.nodes():
    graph[node] = list(nx.neighbors(G, node))

print(graph)

{'cc': ['gc', 'da'],
 'gc': ['cc'],
 'da': ['cc'],
 'ee': ['cd', 'bg'],
 'cd': ['ee'],
 'bg': ['ee', 'de'],
 'de': ['bg']}
2 голосов
/ 13 апреля 2020

Использование networkx.convert.to_dict_of_lists :

import networkx as nx

edges = ["cc-gc", "cc-da", "ee-cd", "ee-bg", "de-bg"]

G = nx.from_edgelist([s.split('-') for s in edges])

print(nx.convert.to_dict_of_lists(G))

Выход

{'bg': ['ee', 'de'],
 'cc': ['gc', 'da'],
 'cd': ['ee'],
 'da': ['cc'],
 'de': ['bg'],
 'ee': ['cd', 'bg'],
 'gc': ['cc']}
1 голос
/ 13 апреля 2020

Если формат node1-node2 для всех элементов списка, то простой для l oop делает трюк

graph = {}
for edge in edges:
  node1, node2 = edge.split('-')
  if node1 in graph.keys():
    graph[node1] += [node2]
  else:
    graph[node1] = [node2]
  if node2 in graph.keys():
    graph[node2] += [node1]
  else:
    graph[node2] = [node1]
...