Report_Generate_Server/tools/1.md

86 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

```python
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
```