Terraform中按指定字段去重对象列表并拼接name字段的方法
按security_group_id和tcp_port分组并拼接name字段的实现方法
我有如下格式的对象列表:
input = [ { "name": "A", "security_group_id": "sg-123456", "tcp_port": 3306 }, { "name": "B", "security_group_id": "sg-123456", "tcp_port": 3306 }, { "name": "C", "security_group_id": "sg-123456", "tcp_port": 443 }, { "name": "D", "security_group_id": "sg-567890", "tcp_port": 22 } ]
需要按security_group_id和tcp_port对列表元素去重,同时将对应的name字段拼接在一起(类似MySQL的GROUP_CONCAT),期望输出如下:
output = [ { "name": "A,B", "security_group_id": "sg-123456", "tcp_port": 3306 }, { "name": "C", "security_group_id": "sg-123456", "tcp_port": 443 }, { "name": "D", "security_group_id": "sg-567890", "tcp_port": 22 } ]
由于对象本身唯一,无法用distinct函数,请问能否通过遍历对象,当其他字段已存在时拼接name字段来实现?
当然可以通过遍历+字典分组的方式实现,核心思路是用**security_group_id和tcp_port的组合作为唯一键**,把同组的name字段拼接起来,具体步骤和代码示例如下:
实现步骤
- 初始化一个空字典,用来缓存分组后的结果,键是
(security_group_id, tcp_port)的元组,值是对应的对象 - 遍历输入列表中的每个对象:
- 提取当前对象的
security_group_id和tcp_port组成组合键 - 如果组合键已在字典中,就将当前对象的
name以逗号分隔的形式拼接到已有对象的name字段后 - 如果组合键不在字典中,就将当前对象的副本存入字典(避免修改原输入对象)
- 提取当前对象的
- 最后将字典的所有值转换为列表,就是最终的输出结果
Python代码示例
input_list = [ { "name": "A", "security_group_id": "sg-123456", "tcp_port": 3306 }, { "name": "B", "security_group_id": "sg-123456", "tcp_port": 3306 }, { "name": "C", "security_group_id": "sg-123456", "tcp_port": 443 }, { "name": "D", "security_group_id": "sg-567890", "tcp_port": 22 } ] grouped = {} for item in input_list: # 生成组合键 key = (item["security_group_id"], item["tcp_port"]) if key in grouped: # 拼接name字段 grouped[key]["name"] += f",{item['name']}" else: # 复制对象存入字典,避免修改原数据 grouped[key] = item.copy() # 转换为列表得到结果 output_list = list(grouped.values()) print(output_list)
运行后输出的结果和期望完全一致。这种方法时间复杂度是O(n),仅需遍历一次即可完成分组,效率很高。
内容的提问来源于stack exchange,提问作者smilin_stan
相关产品推荐
相关产品推荐

