You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何将数据库查询结果转为不等长列横向表格?(基于PrettyTable)

使用Python PrettyTable实现列长不一致的横向表格转换

步骤1:先把原始数据按ID分组

首先需要将数据库返回的idvalue列表按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

火山引擎 最新活动