在实现混合关联时,发现处理多层关联的代码有点复杂。
左右关联,首先想到的是树,只看一个source,树确实是个不错的选择,尤其是自底向上逐层关联的场景中,树保证了可回溯。可是在多个表join成一个数据集时,同一层的多个source又构成链表,也就是说要在遍历树的同时,还要兼顾list。
从source的定义来看,是个嵌套列表,网上能找到很多flat的实现。可是要实现自底向上,还是要加自己写的代码。
source的定义,像是一个由二叉树构成的列表,可是在同一层之内,多个source之间有一个“主表”并联起多张表(join的习惯用法)。这样看,就是个有向图。图的路径发现功能可以实现可回溯。
NetworkX提供了MultiDiGraph、DiGraph两种有向图结构,两者的区别,在于MultiDiGraph允许两个节点之间,存在多个相同方向的边,这个功能暂时用不到,只要用DiGraph就够了。
验证数据:
import networkx as nx
import matplotlib.pyplot as plt
data_dict = {
1:[{'left':20, 'right':21}],
20:[{'left':30, 'right':31}],
21:[{'left':40, 'right':41}],
30:[],
31:[],
40:[],
41:[]
}
G = nx.DiGraph()
# step 1: add edges
for key in data_dict:
print(key)
for source in data_dict[key]:
if 'left' in source:
print('left [%d]' % (source['left']))
if source['left'] in data_dict:
G.add_edge(key, source['left'])