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

如何基于索引从字典中提取值并保留原键名

解决方法

你之前的方法把所有元素合并后提取,确实无法将结果对应回原字典的键。我们可以通过计算每个键对应的全局索引范围,把全局非空索引映射为局部索引,从而生成保留原键名的目标字典。

步骤分解

  • 计算每个键的全局起始索引:通过累加前面所有键对应列表的长度得到,比如键0的起始索引是0,键1的起始索引是键0列表的长度(5)。
  • 对每个键,筛选出notna_idxs中属于该键全局索引范围内的元素。
  • 将这些全局索引转换为局部索引(全局索引 - 该键的起始索引),再从原列表中提取对应元素。
  • 把提取后的元素列表与原键绑定,组成最终字典。

实现代码

notna_idxs = [1, 2, 3, 4, 6, 7, 8]
na_idxs = [0, 5, 9]

dd = {
    0: [0, 1, 2, 3, 4],
    1: [0, 1, 2, 3, 4],
}

# 计算每个键对应的全局起始索引
start_indices = {}
current_start = 0
# 按键的顺序遍历,确保起始索引计算正确
for key in sorted(dd.keys()):
    start_indices[key] = current_start
    current_start += len(dd[key])

# 构建最终结果字典
result = {}
for key in dd:
    start = start_indices[key]
    end = start + len(dd[key])
    # 筛选当前键范围内的非空全局索引,转为局部索引
    local_indices = [idx - start for idx in notna_idxs if start <= idx < end]
    # 提取对应元素
    result[key] = [dd[key][idx] for idx in local_indices]

print(result)

运行结果

{
    0: [1, 2, 3, 4],
    1: [1, 2, 3],
}

代码说明

  • start_indices字典记录每个键对应的全局起始位置,比如键0对应0,键1对应5,这是映射全局索引到局部索引的关键。
  • 遍历每个键时,先确定该键覆盖的全局索引区间[start, end),再筛选出该区间内的非空索引,转成局部索引后提取元素。
  • 这种方法无需合并所有元素,直接针对每个键处理,既保证了原键名的保留,也提升了处理效率。

内容的提问来源于stack exchange,提问作者Jose M. González

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:41:20