我想用Python来解决图论问题(我是图论的完全新手)。
数据采用以下格式:
edges = [('Child1', 'Parent1'), ('Child2', 'Parent2'), ('Child3', 'Parent1'),
('Child4', 'Parent3'), ('Child2', 'Parent1')]
我需要分析的关系包括:
使用Python查找上面列出的关系的最佳方法是什么?
答案 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']