如何用嵌套循环创建目标字典?现有代码输出异常求排查修正
嵌套字典创建错误分析与修正
目标结构
你想要创建的嵌套字典结构如下:
{0: {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 1: {0: 6, 1: 7, 2: 8, 3: 9, 4: 10}, 2: {0: 11, 1: 12, 2: 13, 3: 14, 4: 15}, 3: {0: 16, 1: 17, 2: 18, 3: 19, 4: 20}}
你的代码
list=[[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20]] dic={} dic2={} for i in range(len(list)): for x in range(len(list[i])): dic[x] = list[i][x] dic2[i]=dic print(dic2)
错误结果
运行后得到的结果为:
{0: {0: 16, 1: 17, 2: 18, 3: 19, 4: 20}, 1: {0: 16, 1: 17, 2: 18, 3: 19, 4: 20}, 2: {0: 16, 1: 17, 2: 18, 3: 19, 4: 20}, 3: {0: 16, 1: 17, 2: 18, 3: 19, 4: 20}}
错误原因
问题出在字典是可变对象:你只初始化了一次dic,每次外层循环都是修改同一个dic里的键值对,然后把这个dic的引用赋值给dic2[i]。这意味着dic2里所有的键最终指向的都是同一个字典对象,最后一次循环(i=3)会把dic的内容全部覆盖,所以所有值都变成了最后一行的内容。
另外注意:不要用list作为变量名,它是Python内置类型,会覆盖内置函数。
修正方法
方法1:每次外层循环新建字典
把dic的初始化放到外层循环内部,这样每次循环都会创建一个全新的字典,避免引用重复:
lst = [[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20]] dic2 = {} for i in range(len(lst)): dic = {} # 每次循环新建一个字典 for x in range(len(lst[i])): dic[x] = lst[i][x] dic2[i] = dic print(dic2)
方法2:使用字典推导式(更简洁)
利用Python的字典推导式可以一行完成嵌套字典的创建,代码更简洁高效:
lst = [[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20]] dic2 = {i: {x: val for x, val in enumerate(row)} for i, row in enumerate(lst)} print(dic2)
这里enumerate函数可以同时获取索引和对应的元素,外层推导式生成外层字典的键i和对应的值(内层字典),内层推导式生成每个子列表对应的字典。
内容的提问来源于stack exchange,提问作者Sinbad
相关产品推荐
相关产品推荐

