You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用嵌套循环创建目标字典?现有代码输出异常求排查修正

嵌套字典创建错误分析与修正

目标结构

你想要创建的嵌套字典结构如下:

{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:24:27