如何将两个列表中的对应字典合并为新字典列表?
解决字典列表对应位置合并的问题
嘿,这个需求其实很常见,咱们可以用Python里的几个简洁技巧轻松实现目标。下面给你两种常用的方法:
方法一:列表推导式 + zip + 字典解包
这是最简洁的写法,一行代码就能搞定:
data = [{"name":"Kane", "age": 29}, {"name":"will", "age": "32"}] data_2 = [ {"Team":"SRH", "Country" :"NZ"}, {"Team":"RCB", "Country" :"WI"}] # 核心代码 data3 = [{**d1, **d2} for d1, d2 in zip(data, data_2)] print(data3) # 输出:[{"name":"Kane", "age": 29, "Team":"SRH", "Country" :"NZ"}, {"name":"will", "age": "32", "Team":"RCB", "Country" :"WI"}]
原理说明:
zip(data, data_2):把两个列表中对应位置的字典配对成元组,比如第一个元组是(data[0], data_2[0]),第二个是(data[1], data_2[1])。{**d1, **d2}:用字典解包语法,把d1和d2的所有键值对合并到一个新字典里。如果两个字典有重复键,后面的d2会覆盖d1的对应值(你的例子里没有重复键,完全适配)。
方法二:循环 + dict.copy() + dict.update()
如果觉得上面的写法有点抽象,这种更直观的循环写法适合新手理解:
data = [{"name":"Kane", "age": 29}, {"name":"will", "age": "32"}] data_2 = [ {"Team":"SRH", "Country" :"NZ"}, {"Team":"RCB", "Country" :"WI"}] data3 = [] for d1, d2 in zip(data, data_2): # 先复制d1,避免修改原字典的数据 merged_dict = d1.copy() # 把d2的键值对添加到复制后的字典里 merged_dict.update(d2) data3.append(merged_dict) print(data3)
原理说明:
d1.copy():创建原字典的副本,防止后续update操作修改原始的data列表里的字典。merged_dict.update(d2):把d2的所有键值对合并到merged_dict中,效果和字典解包一致。
额外说明:处理列表长度不一致的情况
如果你的两个列表长度不一样,zip只会处理到较短列表的长度。如果想保留所有元素,可以用itertools.zip_longest,配合fillvalue填充空字典:
from itertools import zip_longest data = [{"name":"Kane", "age": 29}, {"name":"will", "age": "32"}, {"name":"Bob", "age": 27}] data_2 = [ {"Team":"SRH", "Country" :"NZ"}, {"Team":"RCB", "Country" :"WI"}] data3 = [{**d1, **d2} for d1, d2 in zip_longest(data, data_2, fillvalue={})] print(data3) # 输出:[{"name":"Kane", "age":29, "Team":"SRH", "Country":"NZ"}, {"name":"will", "age":"32", "Team":"RCB", "Country":"WI"}, {"name":"Bob", "age":27}]
内容的提问来源于stack exchange,提问作者sankar nataraj




