Python遍历字典数组遇TypeError与AttributeError问题求助(仅允许修改数据结构)
解决字典数组遍历的属性访问问题
我来帮你梳理下问题根源和解决方案:
首先,你遇到的第一个错误 AttributeError: 'dict' object has no attribute 'table_id' 其实很明确——你的total是字典列表,字典的键必须用方括号语法(比如t['table_id'])访问,而不是点号(.table_id),因为字典没有所谓的“属性”,只有键值对。
但你说无法修改循环结构(也就是不能把t.table_id改成t['table_id']),那我们就从调整数据结构入手,把字典转换成可以用点号访问属性的对象,最简便的方式是用Python标准库的collections.namedtuple:
具体步骤:
- 定义一个与字典键名完全匹配的namedtuple类,用来封装每个条目
- 把原始的字典列表转换成namedtuple实例列表
- 再运行你原来的循环代码就不会报错了
完整示例代码:
from collections import namedtuple import datetime # 定义namedtuple,字段名和字典的键保持一致 TableRecord = namedtuple('TableRecord', ['table_id', 'created']) # 你的原始数据 total = [ {'table_id': 'IA_AUTO_2020-11-25', 'created': datetime.datetime(2020, 11, 25, 5, 36, 1, 281000, tzinfo=datetime.timezone.utc)}, {'table_id': 'IA_AUTO_2020-12-07', 'created': datetime.datetime(2020, 12, 7, 5, 55, 4, 142000, tzinfo=datetime.timezone.utc)}, {'table_id': 'IA_AUTO_2020-12-09', 'created': datetime.datetime(2020, 12, 9, 5, 52, 55, 48000, tzinfo=datetime.timezone.utc)} ] # 转换数据结构:字典 → namedtuple实例 total = [TableRecord(**item) for item in total] # 你原来的遍历代码,现在可以正常运行 n=[] d=[] for t in total: n.append(t.table_id) d.append(t.created) total.append(t.table_id) total.append(t.created) print(n)
关于第二个错误 TypeError: 'list' object is not callable
这个错误是因为你不小心把列表total当成函数调用了(比如代码里写了total('trending_CL')),这是语法错误,确保循环是for t in total:而不是调用列表。另外要注意:你的循环里一直在往total里追加字符串和datetime对象,这会导致无限循环(列表长度不断增加),而且后续循环到这些非namedtuple元素时,依然会出现属性访问错误。如果这不是你的预期行为,可能需要重新考量需求,但如果必须保留现有循环结构,上面的转换至少能解决最初的AttributeError问题。
内容的提问来源于stack exchange,提问作者Juan Penaloza
相关产品推荐
相关产品推荐

