如何创建按Key聚合Id的无重复Key新列表?
问题:聚合Key对应的Id集合
现有如下oldList,每个元素包含Id字段与Key数组:
oldList= [ {"Id":1, "Key":["T2","T1"]}, {"Id":2, "Key":["T3","T5"]}, {"Id":3, "Key":["T2"]}, {"Id":4, "Key":["T3","T1"]}, {"Id":5, "Key":["T2","T4"]}, {"Id":6, "Key":["T2","T1","T3"]}, ]
需要将每个Key对应的所有Id进行聚合,生成无重复Key的新列表newList,格式示例如下:
newList = [ {"Key":"T1","Ids":[1,4,6]}, {"Key":"T2", "Ids":[1,3,5,6]}, {"Key":"T3", "Ids":[2,4,6]}, {"Key":"T5", "Ids":[2]}, {"Key":"T4", "Ids":[5]} ]
我曾尝试用嵌套循环提取Id,但代码无法正常工作:
for i in lista_2: for KeyId in i["Key"]: if KeyId == KeyId : #grab Id
解决方案
用字典做中间映射是最高效的方式,字典的键天然唯一,刚好用来存储不重复的Key,值则对应收集到的Id列表。具体实现步骤:
- 初始化空字典,用于暂存Key与对应Id的映射关系
- 遍历
oldList中的每个元素 - 对每个元素的
Key数组逐一处理,将当前元素的Id添加到字典对应Key的列表中(若Key不存在则先创建空列表) - 最后将字典转换为要求的
newList格式
完整代码:
oldList= [ {"Id":1, "Key":["T2","T1"]}, {"Id":2, "Key":["T3","T5"]}, {"Id":3, "Key":["T2"]}, {"Id":4, "Key":["T3","T1"]}, {"Id":5, "Key":["T2","T4"]}, {"Id":6, "Key":["T2","T1","T3"]}, ] # 初始化中间映射字典 key_id_map = {} for item in oldList: current_id = item["Id"] for key in item["Key"]: # 若Key未在字典中,先初始化空列表 if key not in key_id_map: key_id_map[key] = [] # 将当前Id加入对应Key的列表 key_id_map[key].append(current_id) # 转换为目标格式的newList newList = [{"Key": k, "Ids": v} for k, v in key_id_map.items()] # 输出结果 print(newList)
运行后即可得到符合要求的聚合结果,每个Key唯一,对应的Ids集合包含所有关联的Id。
内容的提问来源于stack exchange,提问作者Shinomoto Asakura
相关产品推荐
相关产品推荐

