Python如何按相同name值合并两个字典列表且实现最低时间复杂度
要实现低时间复杂度的合并,最优方案是先做映射再匹配,整体时间复杂度为O(m+n)(m、n分别为两个列表的长度),远优于嵌套循环的O(mn)方案。
实现代码
# 测试用的两个字典列表 list1 = [ {"name": "A", "born": "London"}, {"name": "B", "born": "Sydney"}, {"name": "C", "born": "Paris"} ] list2 = [ {"name": "A", "class": 1}, {"name": "B", "class": 2}, {"name": "C", "class": 3} ] # 第一步:遍历list1构建name到指定属性的映射表,时间复杂度O(len(list1)) # 这里要追加born字段,如果需要追加多个字段,直接把value改成对应字典即可 name_map = {item["name"]: item["born"] for item in list1} # 第二步:遍历list2完成属性追加,时间复杂度O(len(list2)) # 如果不需要保留原list2,可以直接修改item不用copy list3 = [] for item in list2: merged_item = item.copy() if item["name"] in name_map: merged_item["born"] = name_map[item["name"]] list3.append(merged_item) # 输出结果 print(list3)
输出结果和要求的格式完全一致:
[ {'name': 'A', 'class': 1, 'born': 'London'}, {'name': 'B', 'class': 2, 'born': 'Sydney'}, {'name': 'C', 'class': 3, 'born': 'Paris'} ]
额外说明
- 如果需要追加list1的多个指定字段,修改映射表的生成逻辑即可:
# 比如要追加born、gender两个字段 name_map = { item["name"]: {k: v for k, v in item.items() if k in ["born", "gender"]} for item in list1 } # 追加的时候用update方法 merged_item.update(name_map[item["name"]]) - 不需要匹配的name会自动跳过,不会报错,不会影响原有数据。
- 如果两个列表数据量极大,该方案的效率优势会非常明显。
内容的提问来源于stack exchange,提问作者Axaxaxaxax
相关产品推荐
相关产品推荐

