如何将值为不同长度列表的字典按索引位置重组为新字典?
问题描述
我有一个值为不同长度列表的字典,需要将原字典中各列表相同索引位置的元素对应到新字典的不同键下:
- 原字典示例:
{'A': [1,2], 'B': [3,4,5]} - 期望得到的新字典:
{'A': [1,3], 'B': [2,4], 'C': [5]}
我尝试使用for循环结合zip_longest处理,但出现列表索引越界错误,代码如下:
for x in range(1, max([len(v) for v in sub_folder_notebooks.values()])): notebook_step[x] = zip_longest([elem[x] for elem in sub_folder_notebooks.values()])
解决方法
你的代码存在两个关键问题:
- 索引范围错误:
range(1, ...)跳过了索引0,且直接通过elem[x]访问元素时,短列表会因索引超出长度触发报错 zip_longest用法错误:你将元素列表嵌套后传入,且未处理短列表缺失位置的填充值
正确的实现方式是直接用zip_longest对齐所有列表的对应位置,再将每组有效元素整理到新字典的键中:
from itertools import zip_longest original_dict = {'A': [1,2], 'B': [3,4,5]} new_dict = {} # 遍历所有索引位置的元素组,短列表缺失位置用None填充 for idx, elements in enumerate(zip_longest(*original_dict.values())): # 过滤掉None,只保留有效元素 valid_elements = [e for e in elements if e is not None] # 生成A、B、C格式的新键 new_key = chr(ord('A') + idx) new_dict[new_key] = valid_elements print(new_dict) # 输出结果:{'A': [1, 3], 'B': [2, 4], 'C': [5]}
关键说明:
zip_longest(*original_dict.values())会自动对齐所有列表的索引,短列表末尾用None补全enumerate用来获取当前索引,以此生成新字典的连续字母键- 过滤
None是为了让新列表只保留原字典中存在的元素,和期望结果一致
内容的提问来源于stack exchange,提问作者cmilligan262
相关产品推荐
相关产品推荐

