Python更新值为列表类型的字典时仅保留最后数据的解决方法
问题原因
你贴出的示例代码片段本身在样例数据下可以跑出正确结果,实际运行时每个键只保留最后一条数据,基本都是因为真实业务代码的循环里误写了重置字典对应值为空列表的逻辑,多余的临时变量回写操作也容易引发值覆盖问题。另外dict.update()是用来批量更新键值对的方法,根本不适用列表追加场景,参数传错就会触发不可哈希类型报错。
正确实现方式
固定4个预置id的场景
如果你的数据id只会是"sensor"、"version"、"frame"、"function"这四个,直接简化遍历逻辑即可。Python列表是可变对象,追加元素时不需要临时变量承接后再回写字典:
# 初始化字典 my_dict = {"sensor": [], "frame": [], "version": [], "function": []} example_list = [("sensor", 245), ("frame", 455), ("frame", 77)] # 遍历追加 for data_id, content in example_list: if data_id in my_dict: my_dict[data_id].append(content)
运行后得到的结果完全符合预期:
{"sensor": [245], "frame": [455, 77], "version": [], "function": []}
兼容后续新增id的场景
如果后续可能出现新的id值,不需要提前初始化所有键,可以用defaultdict简化逻辑,遇到不存在的键会自动创建空列表作为值:
from collections import defaultdict my_dict = defaultdict(list) example_list = [("sensor", 245), ("frame", 455), ("frame", 77)] for data_id, content in example_list: my_dict[data_id].append(content)
注意事项
- 列表是引用类型,通过
my_dict[key]拿到列表对象后直接调用append()修改,字典内存储的列表会同步变更,不需要再执行赋值回写操作,多余的赋值反而容易引入覆盖bug - 不要在循环内部写重置字典值为空列表的逻辑,否则每次遍历都会清空之前存储的所有数据,最终只会保留最后一条
- 不要用
update()方法做列表元素追加,这个方法的入参是键值对组成的字典或可迭代对象,用法不对就会触发类型报错
内容的提问来源于stack exchange,提问作者grace
相关产品推荐
相关产品推荐

