如何用列表推导式将字典列表转换为Data数据类列表?
问题修正:将JSON转为Data数据类实例列表
现有JSON结构
[ { "name": "blabla1", "value": "1" }, { "name": "blabla2", "value": "2" }, { "name": "blabla3", "value": "3" } ]
定义的Data数据类
from dataclasses import dataclass, field @dataclass class Data: name: str = field(init=True) value: str = field(init=True) is_valid: bool = field(init=False, default=True)
需求
读取上述JSON内容(已解析为包含3个字典的列表v),生成一个Data数据类的实例列表。
现有错误实现
当前尝试的列表推导式存在问题:
data = [[(Data(name=k, value=v, is_valid=True)) for k, v in v.items()] for d in v]
执行后得到嵌套列表:外层因变量名冲突出现错误数量的元素,每个子列表包含2个Data实例,完全不符合需求。
正确实现方法
方法1:字典解包(推荐)
利用Python字典解包特性,直接将每个字典的键值对作为参数传入Data构造方法,is_valid会自动使用默认值True:
data = [Data(**d) for d in v]
方法2:显式指定字段
如果需要明确控制字段赋值,可手动提取字典中的name和value字段:
data = [Data(name=d["name"], value=d["value"]) for d in v]
错误原因说明
原代码的核心问题:
- 变量名冲突:外层循环迭代变量是
d,但内层错误使用v.items()(v是整个字典列表,而非当前遍历的单个字典),应改为d.items()。 - 不必要的双层循环:每个字典仅需生成一个
Data实例,遍历字典键值对会生成多余实例,同时导致嵌套列表结构。
内容的提问来源于stack exchange,提问作者Ran Pol
相关产品推荐
相关产品推荐

