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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 01:06:08