嵌套列表处理:合并相同产品ID与名称的数据为字典列表
如何合并重复产品条目并转换为字典列表
问题回顾
你有一个包含产品ID、名称和数据列表的元组列表,想要将相同产品ID和名称的条目合并,把对应的数据列表拼接成一个列表,最终转换成指定格式的字典列表。
原始数据
x = [ (14, 'netflix', [1, 2, 3, 4, 5, 6]), (14, 'netflix', [7, 8, 9, 10]), (15,'tv', [1, 2, 3, 4, 5]), (15, 'tv', [7, 8, 9]), (16, 'radio', [1, 2, 3, 4]), (16, 'radio', [1, 2, 3, 4]) ]
期望输出
[ {'product_id':14, 'product':'netflix', 'values':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}, {'product_id':15, 'product': 'tv', 'values':[1, 2, 3, 4, 5, 7, 8, 9]}, {'product_id':16, 'product': 'radio', 'values':[1, 2, 3, 4, 1, 2, 3, 4]} ]
(注:你给出的期望输出里tv的values多了个6,应该是笔误,实际合并后是上述结果)
解决方案
不需要用嵌套循环(那样会重复遍历,效率低),我们可以用临时字典分组的方式来实现,逻辑清晰且高效:
代码实现
# 初始化临时字典,用于按产品ID+名称分组 grouped = {} # 遍历原始列表,分组合并数据 for product_id, product_name, data_list in x: # 用(product_id, product_name)作为唯一键,确保同一产品的条目被分组 key = (product_id, product_name) if key not in grouped: # 首次遇到该产品时,初始化空列表 grouped[key] = [] # 将当前数据列表的元素追加到分组列表中(用extend而非append,避免嵌套列表) grouped[key].extend(data_list) # 转换为目标格式的字典列表 result = [ {'product_id': pid, 'product': name, 'values': data} for (pid, name), data in grouped.items() ] # 验证结果 print(result)
逻辑解释
- 分组逻辑:用
(product_id, product_name)作为字典的键,因为这个组合是每个产品的唯一标识,不会重复,确保同一产品的所有数据都被分到同一组。 - 合并数据:使用
extend()方法把每个数据列表的元素逐个添加到分组列表中,而不是append()(后者会把整个列表作为一个元素加入,导致嵌套)。 - 转换格式:最后用列表推导式把分组后的字典转换成你需要的字典列表格式,一步到位。
补充说明
如果你担心重复数据(比如radio的两个相同数据列表),可以根据需求改成去重逻辑,比如把grouped[key].extend(data_list)改成grouped[key].extend(item for item in data_list if item not in grouped[key]),但根据你的期望输出,是保留重复数据的,所以当前代码完全符合需求。
内容的提问来源于stack exchange,提问作者William Goodwin
相关产品推荐
相关产品推荐

