Python中合并同type值的字典数据至对应列表的实现问题
解决按type分组字典数据的问题
需求回顾
你需要将包含data和type字段的字典列表,按type的值分组,把对应data整理到以type为键的列表中,最终输出一个包含分组字典的列表。
正确实现方法
方法一:使用字典setdefault分组(推荐,无需排序)
这种方法直接遍历原列表,按type值收集对应的data,最后转换成预期的列表格式:
def group_by_type(items): grouped = {} for item in items: # 获取当前元素的type和data type_key = item["type"] data_item = item["data"] # 如果type_key不存在则创建空列表,再添加data grouped.setdefault(type_key, []).append(data_item) # 将分组后的字典转换为预期的列表格式 return [{key: value} for key, value in grouped.items()]
测试示例数据:
sample_data = [ {"data": {"id": 61, "title": "First"}, "type": "like"}, {"data": {"id": 62, "title": "Seven"}, "type": "like"}, {"data": {"id": 103, "title": "Third"}, "type": "dislike"}, {"data": {"id": 7, "title": "Fifth"}, "type": "dislike"} ] print(group_by_type(sample_data))
输出结果完全符合你的预期:
[ {"like": [{"id": 61, "title": "First"}, {"id": 62, "title": "Seven"}]}, {"dislike": [{"id": 103, "title": "Third"}, {"id": 7, "title": "Fifth"}]} ]
方法二:使用itertools.groupby(需先排序)
如果想用groupby,需要先按type排序(因为groupby只会分组连续的相同元素):
from itertools import groupby def group_by_type_groupby(items): # 先按type字段排序,确保同类型元素连续 sorted_items = sorted(items, key=lambda x: x["type"]) grouped = {} # 按type分组,提取每组的data for type_key, group in groupby(sorted_items, key=lambda x: x["type"]): grouped[type_key] = [item["data"] for item in group] # 转换为预期格式 return [{key: value} for key, value in grouped.items()]
原代码问题分析
你之前的代码是提取所有字典的键(data和type),然后收集每个键对应的所有值,相当于把原列表中所有data字段合并成一个列表,所有type字段合并成另一个列表,这和“按type值关联对应data”的需求完全不符。原代码的逻辑是对字典的键进行分组,而不是对字典的type值进行分组,所以结果不符合预期。
内容的提问来源于stack exchange,提问作者Venessa
相关产品推荐
相关产品推荐

