Python遍历含等长列表值的字典 按索引拆分生成多个新字典
字典按列表索引逐一生成新字典实现方案
核心逻辑
你的需求本质是把原字典里存储的等长列表做「按行拆分」,每行搭配固定不变的单值字段生成独立字典,且支持生成一个处理一个,不需要预先生成全部结果占用内存。
- 首先拆分原字典字段为两类:固定单值字段、列表值字段,同时校验所有列表长度一致,避免索引错位
- 以列表公共长度为循环次数,每次循环取所有列表对应索引位置的值,和固定字段组合成新字典
- 每生成一个新字典立刻执行自定义处理逻辑,处理完成再进入下一轮循环
完整代码
# 注意:不要用dict作为变量名,会覆盖Python内置的dict类型,这里改名为source_data source_data = { 'cost': [1, 3, 4, 8, 10], 'address': '123 Fake St', 'phone number': '123-456-7890', 'item': ['apple', 'banana', 'strawberry', 'paper', 'pencil'], 'name': 'John David' } # 拆分固定字段、列表字段,校验列表长度 fixed_map = {} list_map = {} common_len = None for key, val in source_data.items(): # Python2环境请把上面的items()换成iteritems() if isinstance(val, list): if common_len is None: common_len = len(val) else: if len(val) != common_len: raise ValueError(f"列表字段{key}长度不匹配,所有列表值长度必须一致") list_map[key] = val else: fixed_map[key] = val # 逐索引生成字典,边生成边处理 for i in range(common_len): # 复制固定字段作为新字典基础 current = fixed_map.copy() # 填充当前索引的列表值 for list_key, content_list in list_map.items(): current[list_key] = content_list[i] # --- 以下位置写你的自定义处理逻辑即可 --- # 示例:打印当前生成的字典,和你给出的预期输出完全一致 print(f"索引{i}对应字典:", current) # 自定义逻辑结束后自动进入下一轮循环
运行上述代码,前两个输出的字典和你给出的dict1、dict2完全匹配。
原有代码的问题
你之前写的defaultdict逻辑是把相同值对应的key归为一组,和按索引拆分字典的需求完全无关,既没有区分单值和列表值,也没有做列表元素的索引对齐,自然达不到预期效果。
内容的提问来源于stack exchange,提问作者ChessGuy
相关产品推荐
相关产品推荐

