Ansible:合并列表中同属性字典,将差异属性值合并为列表
合并列表中同属性字典的实现方法
核心思路是通过一个临时字典按指定属性(这里是name)分组,遍历原列表时收集相同属性对应的目标字段值,最终转换为目标列表。以下是Python的实现代码:
original_list = [ {"name": "samename", "content": "content1"}, {"name": "samename", "content": "content2"}, {"name": "differentname", "content": "content3"} ] grouped = {} for item in original_list: name = item["name"] content = item["content"] if name in grouped: # 若已有该name,将content转为列表后追加新值 if not isinstance(grouped[name]["content"], list): grouped[name]["content"] = [grouped[name]["content"]] grouped[name]["content"].append(content) else: # 首次遇到该name,直接存入副本避免修改原数据 grouped[name] = item.copy() # 转换为最终结果列表 result = list(grouped.values()) print(result)
代码说明
- 用
grouped字典按name做分组键,存储每个name对应的合并后字典。 - 遍历原始列表时,若当前
name已存在于分组字典中:- 先检查
content是否为列表,若不是则转换为列表,再追加新的content值。
- 先检查
- 若当前
name未出现过,直接将当前字典的副本存入分组字典(使用copy()防止后续修改影响原数据)。 - 最后将分组字典的所有值转为列表,得到符合要求的结果。
运行代码后输出结果:
[ {"name": "samename", "content": ["content1", "content2"]}, {"name": "differentname", "content": "content3"} ]
可选调整
如果希望所有content字段统一为列表类型(即使只有一个值),可以修改首次存入的逻辑:
else: grouped[name] = {"name": name, "content": [content]}
这样differentname对应的content会变成["content3"],可根据实际需求选择。
内容的提问来源于stack exchange,提问作者Marisol
相关产品推荐
相关产品推荐

