@lightitup22

У меня есть много терминов — как их связать в дерево (или какую-то диаграмму)?

Есть, скажем, массив с терминами:
['car', 'wheel', 'door', 'room', 'roof', 'window', 'tractor', 'house', 'motor']


Я бы хотел построить диаграмму (граф), в котором все эти элементы будут отображены и связаны друг с другом (если эта связь есть). Например "дверь" есть и у "автомобиля" и у "дома". А двигатель есть только у "автомобиля" и "трактора". Как задать такую связь (на уме только mindMap-ы или JSON-ы с указанием термина и родителя)?

Как такое гуглить?
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
tsarevfs
@tsarevfs
C++ developer
Есть 2 основных способа хранения графов:
  • Список смежности
  • Матрица смежности

Если второй удобен для почти полных графов, где каждая вершина имеет связь с каждой, то в вашем случае удобнее использовать первый.
Если вы захотите хранить дополнительную информацию о типе связи, то можно назначить им номера(id) или просто хранить данные в той же структоре данных.

from collections import defaultdict as ddict
import pygraphviz as pgv

graph = ddict(set)

nodes = ['car', 'wheel', 'door', 'window']

graph[0].add((1, 'contains'))
graph[0].add((2, 'contains'))
graph[2].add((3, 'contains'))
graph[1].add((0, 'contained in'))
graph[2].add((0, 'contained in'))
graph[3].add((2, 'contained in'))

A=pgv.AGraph(directed=True)

for i, text in enumerate(nodes):
	A.add_node(i, label=text)

for node, node_edges in graph.items():
	for edge in node_edges:
		A.add_edge(node, edge[0], label=edge[1])

A.layout(prog='dot')
A.draw('simple.png') # draw png

5de7c6b25c788415564570.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы