Python字典仅追加列表第一个元素的问题排查求助
问题成因
return语句缩进错误,放在了for循环内部,循环执行第一次就会直接返回结果,不会遍历后续列表元素- 循环内直接对
self.dict_nums做全量赋值{i: i},而非追加键值对,就算调整return位置,最终也只会保留列表最后一个元素对应的键值对 if i in self.lst的判断完全冗余,遍历变量i本身就来自self.lst,判断结果恒为真__init__方法中先接收传入的dict_nums参数赋值给实例属性,紧接着又赋值为空字典,传入的参数完全无效- 原代码缺少
json库导入,且存储文件时额外对返回的字典做了str()转换再执行json.dumps,最终存储的是字符串格式内容而非标准JSON结构,属于多余操作
修复方案
修改后的代码如下:
import json class Nums: def __init__(self, lst_nums: list, dict_nums: dict = None): self.lst = lst_nums # 优先使用传入的字典,没有传入则默认初始化空字典 self.dict_nums = dict_nums if dict_nums is not None else {} def changer(self): # 若需要保留空字符串键值对可以取消注释下一行 # self.dict_nums = {"": ""} for i in self.lst: # 追加键值对,而非全量覆盖字典 self.dict_nums[i] = i # 循环结束后再返回结果 return self.dict_nums f = Nums(lst_nums=[1, 4, 5, 6, 7], dict_nums={}) with open('number.txt', 'w') as number: # 无需转str,直接对字典做json序列化即可 number.write(json.dumps(f.changer()))
修改点说明:
- 调整
return语句缩进,放在for循环外部,保证遍历完全部列表元素后再返回结果 - 循环内改为字典追加键值对的写法
self.dict_nums[i] = i,不再全量覆盖字典 - 删除冗余的
if i in self.lst判断 - 优化
__init__方法的字典参数处理逻辑,让传入的dict_nums参数可以正常生效 - 补充
json库导入,去掉文件写入时多余的str()转换,保证存储的是标准JSON格式的字典内容
运行修改后的代码,生成的number.txt内容为{"1": 1, "4": 4, "5": 5, "6": 6, "7": 7},符合预期需求。
内容的提问来源于stack exchange,提问作者makim
相关产品推荐
相关产品推荐

