如何在Python中分析和识别有向图关系(节点之间)

时间:2017-01-19 15:00:36

标签: python python-3.x networkx

我想用Python来解决图论问题(我是图论的完全新手)。

数据采用以下格式:

edges = [('Child1', 'Parent1'), ('Child2', 'Parent2'), ('Child3', 'Parent1'), 
     ('Child4', 'Parent3'), ('Child2', 'Parent1')]

我需要分析的关系包括:

  • Child2的父母是Parent1和Parent2
  • Parent1是Child1,Child2和Child3的父级。

使用Python查找上面列出的关系的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

由于您标记了networkx,因此这是使用该库的解决方案。

在下面的代码中,我创建了一个方向图,然后添加列表中的边。重要提示:边缘中的第一个节点将是源节点,第二个节点将是目标节点,即子节点将指向其父节点。

为了得到孩子的父母,我使用out_edges并获得父母的孩子,我使用in_edges。请注意,这两个函数都返回一个边列表。

import networkx as nx

edges = [('Child1', 'Parent1'), ('Child2', 'Parent2'), ('Child3', 'Parent1'), 
     ('Child4', 'Parent3'), ('Child2', 'Parent1')]

G = nx.DiGraph()
G.add_edges_from(edges)

print(G.out_edges('Child2'))  # parents of Child2
print(G.in_edges('Parent1'))  # children of Parent1

输出:

[('Child2', 'Parent2'), ('Child2', 'Parent1')]
[('Child2', 'Parent1'), ('Child1', 'Parent1'), ('Child3', 'Parent1')]

您可以使用列表推导来获取包含个别孩子或父母的列表。

temp = [edge[1] for edge in G.out_edges('Child2')]
print('Parents of Child2:', temp)

temp = [edge[0] for edge in G.in_edges('Parent1')]
print('Children of Parent1:', temp)

输出:

Parents of Child2: ['Parent2', 'Parent1']
Children of Parent1: ['Child2', 'Child1', 'Child3']

答案 1 :(得分:0)

我会在父母和孩子之间进行映射:

>>> edges = [
...     ('Child1', 'Parent1'), ('Child2', 'Parent2'), ('Child3', 'Parent1'), 
...     ('Child4', 'Parent3'), ('Child2', 'Parent1')
... ]

>>> from collections import defaultdict
>>> parents = defaultdict(list)  # Key: child, value: list of parents
>>> children = defaultdict(list)  # Key: parent, value: list of children
>>> for child, parent in edges:
...     parents[child].append(parent)
...     children[parent].append(child)
... 
>>> parents['Child2']  # Child2's parents are Parent1 and Parent2
['Parent2', 'Parent1']
>>> children['Parent1'] # Parent1 is a parent to Child1, Child2 and Child3.
['Child1', 'Child3', 'Child2']