Python遍历列表与嵌套列表 使用zip批量生成字典的实现问题
问题根因
原代码运行只输出最后一个字典的原因非常直接:循环过程中每次生成的新字典都会直接覆盖result变量的旧值,循环执行完成后,变量内仅保留最后一次迭代生成的字典,前面所有子列表的转换结果都被覆盖丢弃了。
可行实现方案
根据使用场景,可以选以下两种实现方式:
方案1:列表推导式批量生成(最简洁)
如果不需要在转换过程中对单个字典做额外处理,直接用列表推导式就能完成所有子列表的转换,哪怕子列表数量到数百级也没有性能问题:
list1 = ['SYNNR', 'NAME', 'BUNDESLAND'] list2 = [['11032', 'POYSDORF-OST', 'NOE'], ['11033', 'POYSDORF-WEST', 'NOE'], ['11034', 'POYSDORF-NORD', 'NOE']] result = [dict(zip(list1, sub_list)) for sub_list in list2]
运行后result是包含3个字典的列表,完全匹配预期输出结果:
[ {'SYNNR': '11032', 'NAME': 'POYSDORF-OST', 'BUNDESLAND': 'NOE'}, {'SYNNR': '11033', 'NAME': 'POYSDORF-WEST', 'BUNDESLAND': 'NOE'}, {'SYNNR': '11034', 'NAME': 'POYSDORF-NORD', 'BUNDESLAND': 'NOE'} ]
方案2:初始化容器逐次追加(适合需单条处理的场景)
如果转换过程中需要对每个生成的字典做校验、写入等自定义逻辑,可以提前初始化一个空列表作为存储容器,每次循环生成字典后追加到容器中,而非直接覆盖变量:
list1 = ['SYNNR', 'NAME', 'BUNDESLAND'] list2 = [['11032', 'POYSDORF-OST', 'NOE'], ['11033', 'POYSDORF-WEST', 'NOE'], ['11034', 'POYSDORF-NORD', 'NOE']] result = [] for sub_list in list2: single_dict = dict(zip(list1, sub_list)) # 此处可添加针对单个字典的自定义处理逻辑 result.append(single_dict) # 如需逐行打印所有字典,直接遍历结果列表即可 for item in result: print(item)
编码提示:Python遍历序列时不推荐使用
range(len(序列))的索引写法,直接遍历可迭代对象本身可读性更好,也能避免索引越界类的bug。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

