You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:21:51