Python基于两个列表生成重复键聚合值字典时触发int无append属性的AttributeError
报错根因定位
你碰到的报错来自两套逻辑的冲突:
- 你初始化的
final_dict是defaultdict(list)类型,这类字典的设计特性是:访问不存在的键时,会自动给该键赋值一个空列表,天生适配批量追加值的聚合场景。 - 但你在循环里写了反向操作逻辑:碰到不存在的键时,直接把对应的值(整数类型)赋值给这个键,直接把defaultdict预留的空列表给覆盖成了整数。
当循环跑到第二轮碰到重复的A键时,这个键对应的值已经是被覆盖的整数1,你再对整数调用append方法,自然就抛出AttributeError: 'int' object has no attribute 'append'的报错。
正确实现方案
两种可落地的写法,都能匹配你期望的{A:[1, 2], B:3, C:4}结构:
- 写法1:先统一聚合为列表,最后拆分单值(逻辑简单,不容易出类型错误)
from collections import defaultdict list_keys = ['A', 'A', 'B', 'C'] list_values = [1,2,3,4] # 第一步:利用defaultdict特性,把所有值统一聚合到列表 temp_dict = defaultdict(list) for k, v in zip(list_keys, list_values): temp_dict[k].append(v) # 第二步:把仅含单个元素的列表替换为原单值,匹配目标结构 final_dict = {} for k, v_list in temp_dict.items(): final_dict[k] = v_list if len(v_list) > 1 else v_list[0]
这种写法完全避开了循环中途的类型判断,逻辑链路最清晰,不会出现类型混乱的问题。
- 写法2:普通字典逐值判断,无需额外创建临时字典
list_keys = ['A', 'A', 'B', 'C'] list_values = [1,2,3,4] final_dict = {} for k, v in zip(list_keys, list_values): if k in final_dict: # 已存在的键,先把原单值转成列表再追加新值 if not isinstance(final_dict[k], list): final_dict[k] = [final_dict[k]] final_dict[k].append(v) else: # 第一次碰到的键,直接存单值 final_dict[k] = v
这种写法不需要依赖collections模块,适合不想引入额外依赖的场景。
内容的提问来源于stack exchange,提问作者Mohamed Thabet Ben Aicha
相关产品推荐
相关产品推荐

