#python #networkx
#python #networkx
Вопрос:
У меня есть двудольный граф B следующим образом:
B.add_nodes_from([1, 2, 3, 4], bipartite=0)
B.add_nodes_from([5, 6, 7, 8], bipartite=1)
B.add_edges_from([(1, 8), (1, 7), (1, 6), (1,5), (2,8), (2,7), (2,6), (3,8), (3,7), (4,8)])
Я бы хотел, чтобы порядок ребер оставался таким, какой они есть при использовании B.edges()
. Вместо этого они выходят в перемешанном виде:
[(1, 8), (1, 5), (1, 6), (1, 7), (2, 8), (2, 6), (2, 7), (3, 8), (3, 7), (4, 8)]
Порядок не обязательно может быть возрастающим или убывающим. Я бы просто хотел, чтобы это было в том порядке, в котором я их добавляю, используя B.add_edges_from(...)
. Таким образом, использование sorted
в этом случае не сработало бы.
Ответ №1:
Словари являются базовой структурой данных, используемой для графов NetworkX, и начиная с Python 3.7 они поддерживают порядок вставки. Это означает, что мы будем получать один и тот же результат при каждом запуске Graph.edges()
.
Для старых python у вас есть Networkx Ordered Graphs
, который обеспечит согласованный порядок представления отчетов об узлах и ребрах
g = nx.OrderedGraph()
g.add_nodes_from([1, 2, 3, 4], bipartite=0)
g.add_nodes_from([5, 6, 7, 8], bipartite=1)
g.add_edges_from([(1, 8), (1, 7), (1, 6), (1,5),
(2,8), (2,7), (2,6), (3,8), (3,7), (4,8)])
print(g.edges())
# EdgeView([(1, 8), (1, 7), (1, 6), (1, 5), (2, 8), (2, 7), (2, 6), (3, 8), (3, 7)...
Комментарии:
1. Это неверно. Ребра не возвращаются в порядке внедрения для упорядоченных графиков. Из документов
The Ordered (Di/Multi/MultiDi) Graphs give a consistent order for reporting of nodes and edges. The order of node reporting agrees with node adding, but for edges, the order is not necessarily the order that the edges were added.