Python中如何将嵌套列表用户数据转换为支持属性访问的对象
实现方案
针对固定字段的批量列表结构化访问需求,优先使用Python标准库能力实现,不需要安装第三方依赖,按适用场景选择即可:
方案1:namedtuple(最优选择,适合不需要修改数据的场景)
这是最轻量的实现方式,内存占用和原生列表几乎一致,访问效率高,代码量极小:
from collections import namedtuple # 字段顺序和原列表内元素的位置严格对应:索引0=name,索引1=age,索引2=address User = namedtuple("User", ["name", "age", "address"]) raw_users = [ ["name1", 24, "address1"], ["name2", 54, "address2"], ["name3", 32, "address3"] ] # 一行代码完成批量转换 users = [User(*item) for item in raw_users] # 直接通过属性访问 print(users[0].age)
运行输出:
24
- 注意:
namedtuple生成的对象属性默认不可修改,如果业务逻辑里需要更新用户的年龄、地址等字段,选下面的方案。
方案2:dataclass(适合需要修改属性的场景)
Python 3.7及以上版本原生支持dataclass,不需要额外写冗余的__init__方法,支持属性修改:
from dataclasses import dataclass @dataclass class User: name: str age: int address: str raw_users = [ ["name1", 24, "address1"], ["name2", 54, "address2"], ["name3", 32, "address3"] ] users = [User(*item) for item in raw_users] print(users[0].age) # 支持直接修改属性 users[0].age = 26
方案3:SimpleNamespace(临时脚本快速实现用)
如果只是写一次性临时脚本,不想额外定义结构,可以直接用标准库的SimpleNamespace快速包装:
from types import SimpleNamespace raw_users = [ ["name1", 24, "address1"], ["name2", 54, "address2"], ["name3", 32, "address3"] ] users = [ SimpleNamespace(name=item[0], age=item[1], address=item[2]) for item in raw_users ] print(users[0].age)
不推荐手写普通类实现
__init__赋值的方式,冗余代码太多,上述三个标准库方案已经可以覆盖所有这类批量结构化数据的访问需求。
内容的提问来源于stack exchange,提问作者SmooK
相关产品推荐
相关产品推荐

