如何基于索引从字典中提取值并保留原键名
解决方法
你之前的方法把所有元素合并后提取,确实无法将结果对应回原字典的键。我们可以通过计算每个键对应的全局索引范围,把全局非空索引映射为局部索引,从而生成保留原键名的目标字典。
步骤分解
- 计算每个键的全局起始索引:通过累加前面所有键对应列表的长度得到,比如键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
相关产品推荐
相关产品推荐

