如何在Python LIST/DICT中新增元素?嵌套字典赋值报错解决
报错原因
直接执行data['d']['no']='4'会触发KeyError:Python原生字典访问不存在的键时,不会自动生成对应的嵌套结构。代码运行到data['d']时,顶级字典中不存在d这个键,自然无法对不存在的子对象做属性赋值,后续对不存在的lang列表做索引赋值也会触发同类错误。
另外就算提前创建了data['d']字典,如果没有初始化lang对应的列表,直接执行data['d']['lang'][0]='quattro'也会报错:空列表没有索引为0的元素,直接按索引赋值会触发IndexError。
正确实现方案
方案1:一次性整体赋值(最适配当前场景)
不需要逐层创建结构,直接给顶级键d赋完整的嵌套值即可,代码最简洁:
data={ 'a':{'no':'1','lang':['uno','one']}, 'b':{'no':'2','lang':['due','two']}, 'c':{'no':'3','lang':['tre','three']} } # 直接给不存在的顶级键d赋值完整结构 data['d'] = {'no':'4','lang':['quattro','four']} print(data)
执行后字典会自动新增d对应的完整节点,无任何报错。
方案2:分步逐层赋值(适合需要逐段设置属性的场景)
如果业务逻辑要求必须分步给子属性赋值,需要先手动初始化每一层不存在的结构,再做赋值操作:
data={ 'a':{'no':'1','lang':['uno','one']}, 'b':{'no':'2','lang':['due','two']}, 'c':{'no':'3','lang':['tre','three']} } # 第一步:先初始化d对应的空字典,否则访问data['d']会报KeyError data['d'] = {} # 第二步:给d下的no字段赋值 data['d']['no'] = '4' # 第三步:初始化d下的lang空列表,否则访问data['d']['lang']会报KeyError data['d']['lang'] = [] # 第四步:给lang列表追加元素,不要直接对空列表做索引赋值 data['d']['lang'].append('quattro') data['d']['lang'].append('four') print(data)
操作列表注意:只有当列表索引位置已经存在元素时,才能用
list[index] = value的方式修改值;新增元素优先用append()(末尾追加)、insert()(指定位置插入),或者直接给列表变量赋完整的列表值。
内容的提问来源于stack exchange,提问作者masjum
相关产品推荐
相关产品推荐

