You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible中基于公共字段a合并两个列表的技术需求问询

按公共字段合并两个字典列表的实现

这场景太常见了——要把两个以a为公共键的字典列表合并,只保留两边都匹配上的项,并且把所有字段整合到同一个字典里对吧?刚好你的示例已经明确了需求,我给你写个通用的Python实现,不管你实际有8个还是10个字段,都能直接用:

实现思路

  1. 先把List2转换成以a的值为键的字典,这样后续查找匹配项的效率是O(1),比每次遍历List2找匹配快多了,数据量大的时候优势明显;
  2. 遍历List1里的每个字典,用它的a值去查第一步生成的字典,如果能找到对应的项,就把两个字典合并;
  3. 把所有合并后的字典收集起来,就是你要的结果。

代码示例

# 你的原始列表
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:58:14