Python中根据匹配ID合并字典列表 多结果以分号分隔
实现两个Python字典列表的匹配合并
我们需要将两个字典列表按规则合并:当dict1中字典的id_contact值存在于dict2中字典的id_company字段(以分号包裹的字符串)时,为dict1的字典添加company_name字段;若有多个匹配的公司名称,用分号;拼接。
原始数据
dict1 = [{'id_contact': '1', 'name': 'Rick'},{'id_contact': '9', 'name': 'John'}] dict2 = [{'id_company': ';1;3;4;11;', 'company_name': 'Nike'},{'id_company': ';1;2;9;', 'company_name': 'Adidas'}]
期望结果
dictmerge = [{'id_contact': '1', 'name': 'Rick', 'company_name': 'Nike;Adidas'},{'id_contact': '9', 'name': 'John', 'company_name': 'Adidas'}]
实现方案
方法一:预处理字典提升效率
先把dict2中的数据转换成以联系人ID为键、公司名列表为值的字典,后续匹配时直接查找,避免重复遍历dict2,适合数据量较大的场景:
# 预处理dict2,构建ID到公司名的映射 id_to_companies = {} for company in dict2: # 拆分id_company字段,去除首尾分号后分割 contact_ids = company['id_company'].strip(';').split(';') for cid in contact_ids: if cid not in id_to_companies: id_to_companies[cid] = [] id_to_companies[cid].append(company['company_name']) # 合并字典列表 dictmerge = [] for contact in dict1: cid = contact['id_contact'] # 复制原字典,避免修改原始数据 merged = contact.copy() if cid in id_to_companies: merged['company_name'] = ';'.join(id_to_companies[cid]) dictmerge.append(merged) print(dictmerge)
方法二:直接遍历匹配(适合小数据量)
如果数据量不大,直接嵌套循环完成匹配,代码更直观简洁:
dictmerge = [] for contact in dict1: cid = contact['id_contact'] merged = contact.copy() matched_companies = [] for company in dict2: # 用带前后分号的格式判断,避免误匹配(比如避免id=1匹配到id=11) if f';{cid};' in company['id_company']: matched_companies.append(company['company_name']) if matched_companies: merged['company_name'] = ';'.join(matched_companies) dictmerge.append(merged) print(dictmerge)
代码说明
- 两种方法都使用
copy()复制原字典,防止修改原始的dict1数据; - 方法一将时间复杂度从O(n*m)优化为O(n+m),数据量越大效率提升越明显;
- 匹配时使用
f';{cid};'的格式判断,避免出现短ID匹配到长ID的误判情况。
内容的提问来源于stack exchange,提问作者Nico44044
相关产品推荐
相关产品推荐

