如何对同一Key下的所有值求和?数据库数据聚合结果异常求助
按产品名称累加数量时的问题解决方法
你从数据库提取到的原始数据是这样的:
Product Name Quantity
a 3
a 5
b 2
c 7
预期要得到按产品名称求和的结果:product = {'a':8, 'b':2, 'c':7 },但你用这段代码运行后只得到'a'=5:
for row in result: product[row['product_name']] += row['quantity']
问题出在哪?
核心原因是你的字典product里没有预先初始化对应产品名称的键。当第一次循环到a对应的数量3时,product['a']这个键根本不存在,直接用+=操作要么会触发KeyError报错,要么如果你的代码里有错误捕获逻辑跳过了这次操作,就只会累加第二次的5,导致最终a的值是5而不是8。
几种可行的解决方法
方法1:用字典的get()方法安全累加
不需要导入额外模块,每次获取当前键的值,不存在就返回0,再加上当前数量:
product = {} for row in result: prod_name = row['product_name'] product[prod_name] = product.get(prod_name, 0) + row['quantity']
get()方法的第二个参数是默认值,当键不存在时就用这个值来计算,完美解决初始值的问题。
方法2:用collections.defaultdict简化代码
如果你的项目经常需要处理这类字典累加的场景,defaultdict会让代码更简洁:
from collections import defaultdict product = defaultdict(int) # 初始化一个默认值为int类型(默认0)的字典 for row in result: product[row['product_name']] += row['quantity'] # 如果需要转换成普通字典(非defaultdict类型),可以这样做: product = dict(product)
defaultdict(int)会自动给不存在的键设置初始值0,直接用+=就不会有问题。
方法3:直接在数据库层面求和(更高效)
其实最推荐的方式是在SQL查询的时候就完成求和,这样不仅减少Python的计算量,还能减少数据库传输的数据量:
SELECT product_name, SUM(quantity) AS total_quantity FROM your_table_name GROUP BY product_name;
这样从数据库拿到的结果直接就是每个产品的总数量,不需要再在Python里循环处理了。
内容的提问来源于stack exchange,提问作者Jason TK
相关产品推荐
相关产品推荐

