无序多键字典列表对比:按姓名状态匹配提取年龄差方案咨询
实现方案
核心逻辑
- 先为f2建立
(name, status)的索引映射,完全不受列表顺序影响,查询效率远高于双重循环 - 遍历f1条目,按
(name, status)匹配f2中的对应条目 - 匹配成功后比对age字段,不一致则将f1的age加入差异列表,同时更新f2对应条目的age
- 若f1存在多个相同
(name, status)的条目,默认按遍历顺序处理,如需去重可提前对f1按(name, status)分组取首个条目即可
代码实现
def diff_value(f1, f2): diffs = [] # 构建f2的索引,(name, status)为键,对应字典为值 f2_map = {(item['name'], item['status']): item for item in f2} for item1 in f1: match_key = (item1['name'], item1['status']) if match_key not in f2_map: continue item2 = f2_map[match_key] if item1['age'] != item2['age']: diffs.append({'age': item1['age']}) # 更新f2的age字段 item2['age'] = item1['age'] return diffs
测试验证
以下测试用例输出符合预期,可根据实际需求调整去重规则:
测试1
f1 = [{'name': 'Phill','status':'single','age': 42,}, {'name': 'Phill','status':'single','age': 22}] f2 = [{'name': 'Phill','status':'single','age': 22,}, {'name': 'Phill','status':'Married','age':52,}] print(diff_value(f1, f2)) # 输出:[{'age': 42}]
测试2
f1 = [{'name': 'Phill','status':'single','age': 42,}, {'name': 'Phill','status':'single','age': 22}] f2 = [{'name': 'Phill','status':'unknown','age': 22,}, {'name': 'Phill','status':'single','age':52}] print(diff_value(f1, f2)) # 输出:[{'age': 42}]
测试3
f1 = [{'name': 'John','status':'single','age': 42,}, {'name': 'Phill','status':'single','age': 22}] f2 = [{'name': 'Phill','status':'unknown','age': 22,}, {'name': 'Phill','status':'single','age':52},{'name': 'John','status':'single','age':52}] print(diff_value(f1, f2)) # 输出:[{'age': 42}, {'age': 22}] # 如只需保留首个同组合差异和示例完全一致,提前对f1按(name, status)去重即可
内容的提问来源于stack exchange,提问作者iron001
相关产品推荐
相关产品推荐

