Python实现字典列表按name和school分组,合并age为列表
解决方案
可以通过分组字典来实现需求,核心思路是用(name, school)的元组作为唯一键,把相同组合的age收集到列表中,最后再根据列表长度决定是保留单个值还是列表形式。
代码实现
original_list = [ {'name': 'Jane', 'age': 12, 'school': 'SIT'}, {'name': 'John', 'age': 13, 'school': 'SMU'}, {'name': 'Jane', 'age': 14, 'school': 'SIT'}, {'name': 'Jane', 'age': 16, 'school': 'SIT'}, {'name': 'John', 'age': 13, 'school': 'NUS'} ] # 用临时字典分组,键是(name, school)元组,值是age列表 grouped = {} for item in original_list: key = (item['name'], item['school']) if key not in grouped: grouped[key] = [] grouped[key].append(item['age']) # 转换为目标格式的列表 result = [] for (name, school), ages in grouped.items(): # 如果只有一个age,就保留单个值,否则用列表 age_val = ages[0] if len(ages) == 1 else ages result.append({'name': name, 'age': age_val, 'school': school}) print(result)
输出结果
[ {'name': 'Jane', 'age': [12, 14, 16], 'school': 'SIT'}, {'name': 'John', 'age': 13, 'school': 'SMU'}, {'name': 'John', 'age': 13, 'school': 'NUS'} ]
代码说明
- 分组阶段:遍历原始列表,用
(name, school)作为唯一标识(元组可哈希,能作为字典键),把所有同组的age收集到列表中。 - 格式转换阶段:遍历分组后的字典,判断每个组的
age列表长度:如果只有一个元素,就直接取单个值;如果多个,就保留列表,最后组装成目标字典并加入结果列表。
这种方法逻辑清晰,时间复杂度为O(n)(n是原始列表的元素个数),效率较高,也能完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Qinisterr
相关产品推荐
相关产品推荐

