如何将值为列表的Python字典转换为字典列表?
问题:将值为列表的字典转换为字典列表
现有如下Python字典,其值均为列表:
users = {'first-name': ['Jim', 'John', 'Jane'], 'last-name': ['Boothe', 'Smith', 'Doe'], 'user': ['100', '101', '102']}
希望将该字典转换为字典列表,每个子字典对应原字典列表中相同索引的键值对,最终得到:
payload = [ {'first-name': 'Jim', 'last-name': 'Boothe', 'user': '100'}, {'first-name': 'John', 'last-name': 'Smith', 'user': '101'}, {'first-name': 'Jane', 'last-name': 'Doe', 'user': '102'} ]
目前已实现生成第一个子字典,但不清楚如何循环处理剩余索引,现有代码如下:
users = {'first-name': ['Jim', 'John', 'Jane'], 'last-name': ['Boothe', 'Smith', 'Doe'], 'user': ['100', '101', '102']} for k in users: dict[k] = users[k][0] payload = [dict] print(payload)
输出为:
[{'user': '100', 'first-name': 'Jim', 'last-name': 'Boothe'}]
解决方案
方法1:通过索引循环构建
先确定值列表的长度(假设所有值列表长度一致),然后遍历每个索引,为每个索引生成对应的子字典:
users = {'first-name': ['Jim', 'John', 'Jane'], 'last-name': ['Boothe', 'Smith', 'Doe'], 'user': ['100', '101', '102']} payload = [] # 获取列表长度,取第一个键对应的列表长度即可 list_length = len(next(iter(users.values()))) for i in range(list_length): sub_dict = {} for key in users: sub_dict[key] = users[key][i] payload.append(sub_dict) print(payload)
方法2:使用zip和字典推导式(更简洁)
利用zip将所有值列表按索引打包,再结合字典推导式快速生成子字典:
users = {'first-name': ['Jim', 'John', 'Jane'], 'last-name': ['Boothe', 'Smith', 'Doe'], 'user': ['100', '101', '102']} keys = users.keys() payload = [dict(zip(keys, values)) for values in zip(*users.values())] print(payload)
逻辑说明:
zip(*users.values())会把每个值列表的对应索引元素打包成元组,比如('Jim', 'Boothe', '100')、('John', 'Smith', '101')- 对每个元组,用
dict(zip(keys, values))将键和对应值配对成字典,最终生成目标列表
内容的提问来源于stack exchange,提问作者Jim Boothe
相关产品推荐
相关产品推荐

