如何在Python 3中用两个嵌套列表生成字典列表?
实现方法说明
当然可以实现这个需求,不过先提个关键细节:你预期输出里的字典包含重复键(比如第一个字典里的两个90:2),但在Python中字典的键是唯一的——如果有重复的键,后面的键值对会自动覆盖前面的。所以实际生成的字典会合并重复键的条目,不过如果重复键对应的值相同,最终结果看起来和你预期的类似。
具体实现代码
用嵌套列表推导式结合zip()函数就能轻松完成:
list_1 = [[100, 90, 90, 85, 70], [100, 90, 90, 85, 80], [105, 100, 90, 90, 85]] list_2 = [[1, 2, 2, 3, 4], [1, 2, 2, 3, 4], [1, 2, 3, 3, 4]] # 生成目标嵌套字典列表 result = [dict(zip(sub_list1, sub_list2)) for sub_list1, sub_list2 in zip(list_1, list_2)] print(result)
代码解释
- 外层的
zip(list_1, list_2)会把两个大列表中对应位置的子列表配对,比如第一次配对的是list_1[0]和list_2[0],第二次是list_1[1]和list_2[1],以此类推。 - 内层的
zip(sub_list1, sub_list2)会把每个子列表里的元素一一对应配对,生成类似(100, 1)、(90, 2)这样的元组。 dict()函数会把这些元组转换成字典,自动处理重复键:如果有相同的键,只会保留最后一次出现的键值对(如果值相同,结果和你预期的一致;如果值不同,后面的值会覆盖前面的)。
实际输出结果
运行上面的代码,你会得到:
[{100: 1, 90: 2, 85: 3, 70: 4}, {100: 1, 90: 2, 85: 3, 80: 4}, {105: 1, 100: 2, 90: 3, 85: 4}]
可以看到,重复的90键被合并了,但因为对应的值相同,所以和你预期的效果一致。如果你的场景中重复键对应的值可能不同,需要保留所有键值对的话,建议改用元组组成的列表(比如[(100,1), (90,2), (90,2), ...]),因为字典无法存储重复键。
内容的提问来源于stack exchange,提问作者Mahir Islam
相关产品推荐
相关产品推荐

