如何用列表推导式从JSON读取嵌套结构生成Person对象
问题:用列表推导式从JSON嵌套结构生成Person对象列表
JSON数据结构
"persons": [ { "A": [ { "type": "type1", "value": "", "is_valid": true }, { "type": "type1", "value": "", "is_valid": true } ] }, { "B": [ { "type": "type2", "value": "", "is_valid": true } ] }, { "C": [ { "type": "type3", "value": "", "is_valid": true }, { "type": "type3", "value": "", "is_valid": false } ] } ]
需求
读取persons字段,返回Person对象列表。Person类包含以下字段:
name: strtype: strvalue: stris_valid: bool
已实现的循环写法
def get_all() -> list[Person]: persons = [] for p in config['persons']: for key, values in p.items(): for value in values: persons.append(Person(type=value['type'], name=f'{key}', value='{}'.format(value['value']), is_valid=value['is_valid'])) return persons
错误的列表推导式尝试
返回了嵌套列表,不符合需求:
return [[(k, v) for k, v in d.items()] for d in config['persons']]
正确的列表推导式写法
保持原循环的嵌套顺序,直接生成Person对象即可:
def get_all() -> list[Person]: return [ Person( type=value['type'], name=key, value=str(value['value']), is_valid=value['is_valid'] ) for p in config['persons'] for key, values in p.items() for value in values ]
说明
列表推导式的循环顺序和原嵌套循环完全一致:
- 遍历
config['persons']中的每个元素p - 遍历
p中的键值对key, values - 遍历
values中的每个value - 为每个
value生成对应的Person对象
这样就能得到和原循环写法完全相同的Person对象列表,而非嵌套结构。
内容的提问来源于stack exchange,提问作者Ran Pol
相关产品推荐
相关产品推荐

