如何在Python中按分类重组SQL查询返回的字典列表
解决SQL返回数据按分类分组的问题
我来帮你搞定这个数据重组的需求,核心问题就是要避免用update()直接覆盖值,而是要把同分类的产品追加到对应分类的容器里。下面给你几种实用的实现方式:
基础实现方式(不用额外库)
先从最直观的写法开始,适合理解底层逻辑:
# 你的原始SQL返回数据 products = [ {'id': 1, 'url': '/static/images/dresses/td1.jpg', 'price': 3000, 'name': 'product1', 'catname': 'Linen', 'catid': 1}, {'id': 4, 'url': '/static/images/dresses/td4.jpg', 'price': 5000, 'name': 'product4', 'catname': 'Linen', 'catid': 1}, {'id': 2, 'url': '/static/images/dresses/td2.jpg', 'price': 2500, 'name': 'product2', 'catname': 'Chiffron', 'catid': 2}, {'id': 3, 'url': '/static/images/dresses/td3.jpg', 'price': 4000, 'name': 'product3', 'catname': 'Chiffron', 'catid': 2}, {'id': 5, 'url': '/static/images/dresses/td5.jpg', 'price': 6000, 'name': 'product6', 'catname': 'Chiffron', 'catid': 2} ] # 初始化空字典存储分组结果 grouped_result = {} for product in products: # 提取当前产品的分类名 category = product['catname'] # 如果分类还没在字典里,先创建一个空列表用来存产品 if category not in grouped_result: grouped_result[category] = [] # 把当前产品追加到对应分类的列表中(这一步是关键,不是替换而是追加) grouped_result[category].append(product) print(grouped_result)
优化:去掉产品中的分类冗余字段
如果不想在产品信息里保留catname和catid,可以在追加前做个清理:
grouped_result_clean = {} for product in products: category = product['catname'] # 复制产品字典并删除分类相关字段 product_info = product.copy() del product_info['catname'] del product_info['catid'] if category not in grouped_result_clean: grouped_result_clean[category] = [] grouped_result_clean[category].append(product_info)
更简洁的实现:用collections.defaultdict
Python的collections模块里的defaultdict可以帮我们省去判断分类是否存在的步骤,自动为新分类创建空列表,代码更简洁:
from collections import defaultdict grouped_result = defaultdict(list) for product in products: category = product['catname'] # 直接追加,defaultdict会自动处理新分类的初始化 grouped_result[category].append(product) # 如果需要转成普通字典(可选) grouped_result = dict(grouped_result)
关于你提到的update()问题
你之前用update()会覆盖数据,是因为update()是直接替换字典中对应键的值,而我们需要的是把同分类的产品累积起来,所以必须用列表(或其他容器)来存储多个产品,再把容器作为键的值,而不是直接把单个产品赋值给键。
比如错误的用法是:
# 错误示例:每次update都会覆盖之前的产品 grouped_result = {} for product in products: grouped_result.update({product['catname']: product})
这样每个分类最后只会保留最后一个产品,而我们要的是把所有同分类产品都存起来,所以必须用列表来承载。
内容的提问来源于stack exchange,提问作者yoyo Ahmed
相关产品推荐
相关产品推荐

