Python实现:基于name值合并列表中的字典
按name分组合并字典列表的Python实现
嘿,这个需求我经常碰到,咱们一步步来解决它!先明确下你的需求:你有一个包含多个字典的列表,每个字典都有name、url、location三个键——其中name可能重复,但url和location都是唯一的。你需要把相同name的字典合并,把对应的url和location分别整理成列表。
比如你的输入示例:
original_list = [ {"name":"A1", "url":"B1", "location":"C1"}, {"name":"A1", "url":"B2", "location":"C2"}, {"name":"A2", "url":"B3", "location":"C3"}, {"name":"A2", "url":"B4", "location":"C4"} ]
期望得到的结果应该是这样的:
result_list = [ {"name":"A1", "urls":["B1", "B2"], "locations":["C1", "C2"]}, {"name":"A2", "urls":["B3", "B4"], "locations":["C3", "C4"]} ]
下面给你两种实用的实现方法:
方法一:用collections.defaultdict(推荐,代码更简洁)
defaultdict是Python标准库collections里的工具,能帮我们自动初始化字典的默认值,非常适合分组场景。
from collections import defaultdict original_list = [ {"name":"A1", "url":"B1", "location":"C1"}, {"name":"A1", "url":"B2", "location":"C2"}, {"name":"A2", "url":"B3", "location":"C3"}, {"name":"A2", "url":"B4", "location":"C4"} ] # 初始化一个defaultdict,每个键对应的值是包含urls和locations的字典 grouped = defaultdict(lambda: {"urls": [], "locations": []}) for item in original_list: name = item["name"] # 把当前item的url和location添加到对应name的列表里 grouped[name]["urls"].append(item["url"]) grouped[name]["locations"].append(item["location"]) # 把defaultdict转换成期望的列表格式 result_list = [{"name": k, **v} for k, v in grouped.items()] print(result_list)
方法二:用普通字典(无需导入模块)
如果不想额外导入库,用普通字典也能实现,只是需要手动判断键是否存在:
original_list = [ {"name":"A1", "url":"B1", "location":"C1"}, {"name":"A1", "url":"B2", "location":"C2"}, {"name":"A2", "url":"B3", "location":"C3"}, {"name":"A2", "url":"B4", "location":"C4"} ] grouped = {} for item in original_list: name = item["name"] if name not in grouped: # 如果name还没在字典里,初始化对应的urls和locations列表 grouped[name] = {"urls": [], "locations": []} grouped[name]["urls"].append(item["url"]) grouped[name]["locations"].append(item["location"]) # 转换为结果列表 result_list = [{"name": k, **v} for k, v in grouped.items()] print(result_list)
两种方法最终都会输出你想要的分组结果,你可以根据自己的场景选择~
内容的提问来源于stack exchange,提问作者SY9
相关产品推荐
相关产品推荐

