如何在Python中将值列表输入到二维数组?附字典转二维数组示例
如何在Python中将列表字典转换为二维数组(稀疏表)
嘿,我来帮你搞定这个问题!你需要把给定的节点关联字典转换成二维数组,而且看起来你已经在写稀疏表的预处理函数了,我来帮你补全代码并把逻辑讲明白。
先明确你的输入和目标
你的输入是这样的列表字典:
input_dict = {'5': ['2', '4', '8'], '6': ['3', '1', '7'], '9': ['4', '8'], '3': ['2', '4'], '1': ['2'], '8': ['2'], '7': ['4'], '2':[], '4':[]}
目标是生成一个二维数组,其中每一行对应一个节点,每一列对应节点的第2^i代祖先(从你的函数注释来看)。
完整实现代码
首先得导入必要的模块,然后补全预处理函数的逻辑:
import math from math import ceil, log def preprocess(p): """ 此函数用于创建节点第2^i代祖先的稀疏表 """ # 把字典的键(节点字符串)转成整数,找到最大节点编号 nodes = list(map(int, p.keys())) N = max(nodes) # 计算需要的层级数:向上取整log2(N),确保覆盖所有可能的祖先层级 LEVEL = ceil(log(N, 2)) if N > 0 else 1 # 初始化二维数组:P[node][i]代表节点node的第2^i代祖先列表 # 节点编号从1到N,所以数组行数是N+1(索引0不用),列数是LEVEL P = [[[] for _ in range(LEVEL)] for node in range(N+1)] # 填充第0层:直接对应字典里的关联列表,同时把字符串转成整数 for node_str in p: node = int(node_str) P[node][0] = list(map(int, p[node_str])) # 填充后续层级的稀疏表 # 逻辑:第i层的祖先 = 第i-1层每个祖先的第i-1层祖先的集合 for i in range(1, LEVEL): for node in range(1, N+1): ancestors = [] # 遍历当前节点的第i-1层祖先,收集他们的第i-1层祖先 for ancestor in P[node][i-1]: if P[ancestor][i-1]: ancestors.extend(P[ancestor][i-1]) # 去重(可选,根据你的需求调整) P[node][i] = list(set(ancestors)) if ancestors else [] return P # 测试代码 input_dict = {'5': ['2', '4', '8'], '6': ['3', '1', '7'], '9': ['4', '8'], '3': ['2', '4'], '1': ['2'], '8': ['2'], '7': ['4'], '2':[], '4':[]} sparse_table = preprocess(input_dict) # 打印结果示例 for node in range(1, len(sparse_table)): print(f"节点 {node} 的稀疏表:{sparse_table[node]}")
关键步骤解释
- 节点编号处理:字典的键是字符串形式的节点号,先转成整数,这样能对应二维数组的行索引(节点1对应第1行,以此类推)。
- 二维数组初始化:根据最大节点数和计算出的层级数,创建一个初始为空列表的二维数组,确保每个节点的每一层都有对应的位置。
- 第0层填充:直接把字典里的关联列表转成整数列表,放到对应节点的第0列(也就是直接祖先/关联节点)。
- 后续层级填充:如果是构建祖先稀疏表,第
i层的祖先就是第i-1层每个祖先的i-1层祖先的集合,这里用extend合并列表,还可以选择去重避免重复的祖先。
简化版本(如果只需要基础转换)
如果你不需要后续层级的稀疏表,只是想把字典转成二维数组的第0层,那可以简化成这样:
import math from math import ceil, log def preprocess(p): """ 将列表字典转换为二维数组的基础版本 """ nodes = list(map(int, p.keys())) N = max(nodes) LEVEL = ceil(log(N, 2)) if N > 0 else 1 P = [[[] for _ in range(LEVEL)] for node in range(N+1)] for node_str in p: node = int(node_str) P[node][0] = list(map(int, p[node_str])) return P
这样就能得到你需要的二维数组结构啦!
内容的提问来源于stack exchange,提问作者dddxxx
相关产品推荐
相关产品推荐

