如何将数据库查询结果转为不等长列横向表格?(基于PrettyTable)
使用Python PrettyTable实现列长不一致的横向表格转换
步骤1:先把原始数据按ID分组
首先需要将数据库返回的id和value列表按id分组,把每个ID对应的所有value整理成单独的列表(也就是你说的bucket)。比如模拟数据库返回的结构:
# 模拟数据库返回的objects列表 db_objects = [ {"id": 1, "value": "mcua"}, {"id": 1, "value": "ujpb"}, {"id": 1, "value": "iefs"}, {"id": 1, "value": "yqsc"}, {"id": 1, "value": "qyas"}, {"id": 1, "value": "ttwx"}, {"id": 1, "value": "lcyk"}, {"id": 1, "value": "yhfe"}, {"id": 1, "value": "lezv"}, {"id": 2, "value": "dwb"}, {"id": 2, "value": "fdd"}, {"id": 2, "value": "ovp"}, {"id": 3, "value": "nkoc"}, {"id": 3, "value": "itxc"}, {"id": 3, "value": "tktu"}, {"id": 3, "value": "zelc"}, {"id": 3, "value": "omzx"}, {"id": 3, "value": "gutq"}, ]
用字典完成分组:
from collections import defaultdict # 按id分组生成各个bucket buckets = defaultdict(list) for obj in db_objects: buckets[obj["id"]].append(obj["value"]) # 按id排序保证列顺序一致 sorted_buckets = [buckets[id] for id in sorted(buckets.keys())]
步骤2:用迭代器实现逐行取元素
核心是把每个bucket转为迭代器,每次取出下一个元素;当bucket元素耗尽时,用空字符串填充单元格,直到所有bucket都处理完毕。结合PrettyTable的完整代码:
from prettytable import PrettyTable # 创建表格并设置列标题 table = PrettyTable() table.field_names = [f"Field {i+1}" for i in range(len(sorted_buckets))] # 将每个bucket转为迭代器,迭代器会记住当前读取位置 iterators = [iter(bucket) for bucket in sorted_buckets] # 循环生成每一行 while True: row = [] has_content = False for it in iterators: # 取当前迭代器的下一个元素,无元素则返回空字符串 val = next(it, "") row.append(val) if val: has_content = True # 所有元素都为空时,说明所有bucket已处理完,退出循环 if not has_content: break # 将生成的行添加到表格 table.add_row(row) # 打印最终表格 print(table)
关键逻辑说明
iter()将列表转为迭代器,每次调用next()会按顺序返回下一个元素,无需手动维护索引。next(it, "")的默认值参数确保短列取完元素后,后续行的对应位置自动填充空白。- 循环终止条件避免生成全空的无效行,保证表格和示例结构一致。
内容的提问来源于stack exchange,提问作者Ricky Levi




