You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:48:14