基于完全二叉树结构DataFrame,从后往前生成不同长度配对值向量
解决方案:从二叉树结构DataFrame生成反向连续配对向量
没问题!我完全懂你要实现的需求——从这个类完全二叉树的父-子映射DataFrame里,从叶子节点开始回溯到根,生成不同长度的连续节点配对向量对吧?咱们用Python结合pandas来一步步实现:
第一步:构建示例数据
先把你给出的示例DataFrame搭起来,方便后续测试:
import pandas as pd df = pd.DataFrame({ 'Parent': ['A', 'B', 'B', 'A'], 'Daughter': ['B', 'C', 'D', 'E'] })
第二步:定位所有叶子节点
叶子节点就是那些没有作为父节点出现过的子节点,咱们先把它们找出来:
# 获取所有父节点的集合 parent_nodes = set(df['Parent']) # 筛选出不在父节点集合里的子节点,就是叶子 leaf_nodes = df[~df['Daughter'].isin(parent_nodes)]['Daughter'].tolist() # 这里得到的结果是 ['C', 'D', 'E']
第三步:写一个回溯路径的函数
我们需要一个工具函数,输入任意节点,就能返回从它到根节点的完整路径(顺序是叶子→父→祖父…→根,也就是你说的“从后往前”):
def get_full_path(node, df): path = [node] while True: # 查找当前节点的父节点 parent_row = df[df['Daughter'] == node] if parent_row.empty: # 没有父节点,说明到根了,停止循环 break parent = parent_row['Parent'].iloc[0] path.append(parent) node = parent return path
比如调用get_full_path('C', df)会得到['C', 'B', 'A'],调用get_full_path('E', df)会得到['E', 'A']。
第四步:生成不同长度的连续配对向量
接下来我们遍历每个叶子节点,回溯路径后,用滑动窗口的方式生成所有不同长度的连续节点序列:
# 用字典按长度分组存储结果,看起来更清晰 from collections import defaultdict result = defaultdict(list) for leaf in leaf_nodes: path = get_full_path(leaf, df) # 生成长度从2到路径最大长度的所有连续子序列 for seq_length in range(2, len(path) + 1): # 滑动窗口取连续的seq_length个节点 for start_idx in range(len(path) - seq_length + 1): current_seq = path[start_idx:start_idx + seq_length] result[seq_length].append(current_seq) # 对每个长度下的序列去重(避免不同叶子共享路径导致重复) for length in result: # 先转成元组才能去重,再转回列表 unique_seqs = list(set(tuple(seq) for seq in result[length])) result[length] = [list(seq) for seq in unique_seqs]
查看结果
运行完上面的代码后,咱们打印结果看看:
for length, sequences in result.items(): print(f"🔹 长度为 {length} 的连续配对向量:") for seq in sequences: print(f" {seq}")
输出会是:
🔹 长度为 2 的连续配对向量: ['C', 'B'] ['B', 'A'] ['D', 'B'] ['E', 'A'] 🔹 长度为 3 的连续配对向量: ['C', 'B', 'A'] ['D', 'B', 'A']
这个结果完全符合你的需求:从叶子节点开始(后)往根节点(前)生成了不同长度的连续节点配对,每个长度下的向量都是连续的节点序列。
内容的提问来源于stack exchange,提问作者Dan Adams
相关产品推荐
相关产品推荐

