Python:如何从多个有序对应值列表创建字典列表
问题描述
有多组顺序对齐的数据列表,例如存储年龄的ages、存储姓名的names、存储性别的genders等,所有列表同索引位置的记录对应同一个人物。需要以最Pythonic的方式基于这些列表生成由字典组成的列表,目前仅能实现单列表的转换,无法适配多列表场景。
当前实现代码:
ages = [20, 21, 30] names = ["Jhon", "Daniel", "Rob"] list_of_dicts = [{"age": value} for value in ages]
当前代码运行输出:
[{'age': 20}, {'age': 21}, {'age': 30}]
期望输出结果:
[{'age': 20, 'name': 'Jhon'}, {'age': 21, 'name': 'Daniel'}, {'age': 30, 'name': 'Rob'}]
实现方案
最简洁符合Python风格的写法是使用内置函数zip()并行遍历多个对齐的列表,直接在列表推导式中组装对应字典:
ages = [20, 21, 30] names = ["Jhon", "Daniel", "Rob"] list_of_dicts = [{"age": age, "name": name} for age, name in zip(ages, names)]
如果后续需要扩展更多字段,比如新增性别列表,只需要把对应列表传入zip(),同步补充字典的键值映射即可:
genders = ["male", "male", "male"] list_of_dicts = [ {"age": age, "name": name, "gender": gender} for age, name, gender in zip(ages, names, genders) ]
如果字段数量很多,不想重复手写键值配对,可以提前把字段名和对应列表做绑定,批量生成结果,扩展性更强:
# 按顺序配置字段名和对应的数据列表 field_config = [ ("age", ages), ("name", names), ("gender", genders) ] field_names = [item[0] for item in field_config] field_datas = [item[1] for item in field_config] list_of_dicts = [dict(zip(field_names, row)) for row in zip(*field_datas)]
补充说明:默认
zip()会以长度最短的列表为基准截断遍历,如果各列表长度不一致建议提前做长度校验,避免数据丢失。如果需要以最长列表为基准遍历、缺失位置自动填充空值,可以替换使用itertools.zip_longest()。
内容的提问来源于stack exchange,提问作者Rasv
相关产品推荐
相关产品推荐

