Python如何基于字典内的列表值生成不含键的美观格式化表格
Python 生成整洁对齐的列表字典表格方案
原生无依赖实现(无需安装第三方库)
适配中英文混排的显示宽度差异,自动计算每列最大宽度,无需额外安装包。
# 示例测试数据(可替换为你的实际字典) data = { "任意键1": ["姓名", "年龄", "城市", "职业", "入职时间"], "任意键2": ["张三", "28", "上海", "后端开发工程师", "2021-03"], "任意键3": ["李四", "35", "北京", "产品经理", "2018-07"], "任意键4": ["王五五", "22", "深圳", "UI设计师", "2023-09"] } def print_aligned_table(data_dict): # 提取所有列表数据,自动丢弃字典键 rows = [list(row) for row in data_dict.values()] # 自动获取列数,适配你的5元素列表场景 col_count = len(rows[0]) # 计算每列的实际显示宽度,兼容中文占2个字符显示宽度的问题 col_widths = [] for col_idx in range(col_count): max_display_width = 0 for row in rows: cell_str = str(row[col_idx]) # 逐字符判断是中文(占2宽)还是英文/符号(占1宽) cell_display_width = sum(2 if ord(c) > 127 else 1 for c in cell_str) if cell_display_width > max_display_width: max_display_width = cell_display_width # 额外加2个空格做内边距,提升观感 col_widths.append(max_display_width + 2) # 逐行打印表格 for row_idx, row in enumerate(rows): formatted_cells = [] for col_idx, cell in enumerate(row): cell_str = str(cell) cell_display_width = sum(2 if ord(c) > 127 else 1 for c in cell_str) # 补空格对齐当前列 padding = col_widths[col_idx] - cell_display_width formatted_cells.append(cell_str + " " * padding) # 用|分隔列,首尾加|形成完整边框 print("|" + "|".join(formatted_cells) + "|") # 第一行默认作为表头,打印分隔线,不需要表头可删除这两行 if row_idx == 0: sep_line = "|" + "|".join(["-" * w for w in col_widths]) + "|" print(sep_line) # 调用执行 print_aligned_table(data)
运行后输出效果:
| 姓名 | 年龄 | 城市 | 职业 | 入职时间 | |------|------|------|----------------|----------| | 张三 | 28 | 上海 | 后端开发工程师 | 2021-03 | | 李四 | 35 | 北京 | 产品经理 | 2018-07 | | 王五五| 22 | 深圳 | UI设计师 | 2023-09 |
第三方库实现(快速开发/多格式需求)
如果需要更丰富的表格样式,推荐用成熟的第三方库,代码更简洁。
1. tabulate(轻量,支持Markdown等多种格式)
先安装依赖:pip install tabulate
代码示例:
from tabulate import tabulate # 提取所有行数据,自动丢弃字典键 rows = list(data.values()) # 直接生成表格,tablefmt可切换样式,常用值: # grid: 带实线边框 github: 标准Markdown格式 plain: 无框纯对齐 print(tabulate(rows, tablefmt="grid"))
如果需要生成可直接粘贴到Markdown文档的表格,把tablefmt改成"github"即可。
2. PrettyTable(功能丰富,支持CLI交互)
先安装依赖:pip install prettytable
代码示例:
from prettytable import PrettyTable rows = list(data.values()) # 第一行设为表头,不需要表头可设置header=False pt = PrettyTable(header=True) pt.field_names = rows[0] pt.add_rows(rows[1:]) # 直接打印 print(pt)
内容的提问来源于stack exchange,提问作者Samuel Pereira
相关产品推荐
相关产品推荐

