如何拆分SQLite分组查询结果并生成含重复元素的列表
问题:拆分SQL分组查询结果为单条记录格式
我有一个SQLite数据库,存储了fruit_name(水果名称)和freeze_time(冷冻时长)两个字段。执行了以下分组查询代码:
cur1.execute("""SELECT fruit_name, freeze_time, COUNT (*) AS total_fruit FROM fruit_page GROUP BY fruit_name, freeze_days""") rows = cur1.fetchall()
查询后rows的结果为:
[('Apple', '2', 2), ('Banana','1',2), ('Banana','2',1)]
我需要把结果拆分为以下格式(将每个批次的数量拆成单条记录,数量字段固定为1):
[('Apple', '2', 1), ('Apple', '2', 1), ('Banana','1',1), ('Banana','1',1), ('Banana','2',1)]
或者实现:当有2个冷冻2天的苹果时,执行循环代码后,basket列表能输出[2, 2]而非仅[2]。原循环代码如下:
for i in range(len(rows)) if fruit_name == apple; basket.append(rows[i][1)
解决方案
方案1:Python中拆分结果为单条记录
遍历查询结果,根据total_fruit的数值重复生成对应次数的单条记录:
# 假设原查询结果rows为给定值 rows = [('Apple', '2', 2), ('Banana','1',2), ('Banana','2',1)] split_rows = [] for fruit, days, count in rows: # 按count次数添加单条记录 split_rows.extend([(fruit, days, 1)] * count) print(split_rows) # 输出:[('Apple', '2', 1), ('Apple', '2', 1), ('Banana', '1', 1), ('Banana', '1', 1), ('Banana', '2', 1)]
方案2:修正循环逻辑生成目标basket列表
调整循环逻辑,根据total_fruit的次数重复添加冷冻时长值:
basket = [] rows = [('Apple', '2', 2), ('Banana','1',2), ('Banana','2',1)] for fruit, days, count in rows: if fruit == 'Apple': # 按count次数添加days到basket basket.extend([days] * count) print(basket) # 输出:['2', '2']
注意事项
原SQL语句里的GROUP BY freeze_days是笔误,数据库字段是freeze_time,需要修正为GROUP BY fruit_name, freeze_time,否则会触发字段不存在的错误。
内容的提问来源于stack exchange,提问作者Justin Habel Kiswanto
相关产品推荐
相关产品推荐

