C#实现:按重复属性分组,将非重复列折叠为子列表
嘿,这个需求我熟!本质就是把重复属性作为分组依据,把唯一属性聚合到子列表里对吧?我给你两种实用的实现思路,你可以根据自己的场景选:
方法一:用字典手动分组(更直观,无需预排序)
这种方法不用提前对列表排序,直接遍历每个对象,把重复属性组合成唯一键,再把唯一属性归集到对应分组的子列表中,灵活性很高。
以Python为例,代码实现如下:
# 假设originalobject是你的对象列表,每个对象具备指定属性 grouped_result = {} for obj in originalobject: # 用重复属性组合成分组的唯一标识键 group_key = (obj.monitorName, obj.ProcessGUID, obj.Apikey, obj.AIRSTATION) # 提取需要折叠的非重复属性,封装成字典方便后续使用 unique_attrs = { "variableName": obj.variableName, "id": obj.id, "AIRSTATIONChannel": obj.AIRSTATIONChannel } # 如果分组不存在,初始化分组结构 if group_key not in grouped_result: grouped_result[group_key] = { "monitorName": obj.monitorName, "ProcessGUID": obj.ProcessGUID, "Apikey": obj.Apikey, "AIRSTATION": obj.AIRSTATION, "details": [] } # 将当前对象的唯一属性添加到分组的子列表中 grouped_result[group_key]["details"].append(unique_attrs) # 把字典的值转换为列表,得到最终的分组结果 final_data = list(grouped_result.values())
方法二:用itertools.groupby(适合可排序的场景)
如果你的列表可以先按重复属性排序,用itertools.groupby会更简洁,这是Python标准库提供的分组工具,效率也不错。
代码示例:
from itertools import groupby # 先按分组属性排序,groupby要求连续的相同键才能被分到同一组 sorted_objects = sorted(originalobject, key=lambda x: (x.monitorName, x.ProcessGUID, x.Apikey, x.AIRSTATION)) final_data = [] # 按指定键分组遍历 for group_key, obj_group in groupby(sorted_objects, key=lambda x: (x.monitorName, x.ProcessGUID, x.Apikey, x.AIRSTATION)): # 解析分组键的属性值 monitor_name, process_guid, api_key, airstation = group_key # 收集组内所有对象的唯一属性,组成子列表 details_list = [ { "variableName": obj.variableName, "id": obj.id, "AIRSTATIONChannel": obj.AIRSTATIONChannel } for obj in obj_group ] # 组装分组结果并添加到最终列表 final_data.append({ "monitorName": monitor_name, "ProcessGUID": process_guid, "Apikey": api_key, "AIRSTATION": airstation, "details": details_list })
结果说明
最终的final_data列表里,每个元素都是一个分组对象:包含重复的monitorName、ProcessGUID、Apikey、AIRSTATION属性,以及一个details子列表,子列表里是该分组下所有对应的variableName、id、AIRSTATIONChannel条目。
内容的提问来源于stack exchange,提问作者user641812
相关产品推荐
相关产品推荐

