Ansible中基于公共字段a合并两个列表的技术需求问询
按公共字段合并两个字典列表的实现
这场景太常见了——要把两个以a为公共键的字典列表合并,只保留两边都匹配上的项,并且把所有字段整合到同一个字典里对吧?刚好你的示例已经明确了需求,我给你写个通用的Python实现,不管你实际有8个还是10个字段,都能直接用:
实现思路
- 先把List2转换成以
a的值为键的字典,这样后续查找匹配项的效率是O(1),比每次遍历List2找匹配快多了,数据量大的时候优势明显; - 遍历List1里的每个字典,用它的
a值去查第一步生成的字典,如果能找到对应的项,就把两个字典合并; - 把所有合并后的字典收集起来,就是你要的结果。
代码示例
# 你的原始列表 List1 = [ {"a" : "1", "b": "2", "c" : "3" }, {"a" : "5", "b": "6", "c" : "7" }, {"a" : "8", "b": "9", "c" : "10" }, {"a" : "11", "b": "12", "c" : "13" }, {"a" : "20", "b": "212", "c" : "213" } ] List2 = [ {"a" : "1", "d": "22", "e" : "32" }, {"a" : "5", "d": "62", "e" : "72" }, {"a" : "8", "d": "92", "e" : "210" }, {"a" : "11", "d": "1222", "e" : "1322" } ] # 把List2转成以a为键的字典,方便快速查找 list2_dict = {item["a"]: item for item in List2} # 合并列表 merged_list = [] for item in List1: a_key = item["a"] # 只保留两边都有的项 if a_key in list2_dict: # 合并两个字典,List1的字段会被List2的同名字段覆盖(如果有的话) merged_item = {**item, **list2_dict[a_key]} merged_list.append(merged_item) # 打印结果 print(merged_list)
运行结果
[ {"a": "1", "b": "2", "c": "3", "d": "22", "e": "32"}, {"a": "5", "b": "6", "c": "7", "d": "62", "e": "72"}, {"a": "8", "b": "9", "c": "10", "d": "92", "e": "210"}, {"a": "11", "b": "12", "c": "13", "d": "1222", "e": "1322"} ]
补充说明
- 如果你的两个列表里有同名字段(除了a),上面的代码里List2的字段会覆盖List1的,要是你想保留List1的字段,把合并顺序改成
{**list2_dict[a_key], **item}就行; - 如果需要保留List1里所有的项(包括List2里没有的,比如示例里a=20的项),把
if a_key in list2_dict:去掉,改成merged_item = {**item, **list2_dict.get(a_key, {})},这样没有匹配的项就只会保留List1的字段; - 这个写法是Python 3.5+支持的字典合并语法,要是用更老的版本,可以用
dict(item, **list2_dict[a_key])(注意仅当字段名是字符串时适用)。
内容的提问来源于stack exchange,提问作者Smily
相关产品推荐
相关产品推荐

