Report_Generate_Server/tools/1.md

2.5 KiB
Raw Permalink Blame History

def tree_dict_to_table_data(tree: Dict) -> List[List[str]]:
    """
    将树状字典转换为二维表格数据
    
    参数:
        tree: 树状字典结构为dict[dict[...[list]]]
        
    返回:
        二维列表表示的表格数据
    """
    if not tree:
        return []
    
    # 首先确定树的深度
    depth = 0
    current = tree
    while isinstance(current, dict):
        depth += 1
        # 获取第一个子节点来继续探测深度
        if current:
            current = next(iter(current.values()))
        else:
            break
    
    # 收集所有路径和叶子节点
    paths = []
    
    def traverse(node, current_path):
        if isinstance(node, dict):
            for key, value in node.items():
                traverse(value, current_path + [str(key)])
        elif isinstance(node, list):
            paths.append((current_path, node))
        else:
            paths.append((current_path, [str(node)]))
    
    traverse(tree, [])
    
    # 确定最大深度(处理可能的不平衡树)
    max_depth = max(len(path) for path, _ in paths) if paths else 0
    max_leaf_length = max(len(leaf) for _, leaf in paths) if paths else 0
    
    # 填充路径到最大深度
    filled_paths = []
    for path, leaf in paths:
        # 填充路径
        filled_path = path.copy()
        while len(filled_path) < max_depth:
            filled_path.append("")  # 用空字符串填充不足的深度
        
        # 填充叶子节点
        filled_leaf = leaf.copy()
        while len(filled_leaf) < max_leaf_length:
            filled_leaf.append("")  # 用空字符串填充不足的叶子长度
            
        filled_paths.append((filled_path, filled_leaf))
    
    # 构建表格数据
    table_data = []
    
    # 添加路径部分的行
    for i in range(max_depth):
        row = []
        for path, leaf in filled_paths:
            row.append(path[i])
        table_data.append(row)
    
    # 添加叶子部分的行
    for i in range(max_leaf_length):
        row = []
        for path, leaf in filled_paths:
            row.append(leaf[i] if i < len(leaf) else "")
        table_data.append(row)
    
    # 转置表格,使每个路径+叶子成为一列
    if table_data:
        # 获取最大列数
        max_cols = max(len(row) for row in table_data) if table_data else 0
        # 统一每行的列数
        table_data = [row + [""] * (max_cols - len(row)) for row in table_data]
        # 转置
        table_data = list(map(list, zip(*table_data)))
    
    return table_data