鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 2993554205

萌新求助,如何让每列的数据对齐输出呢?

[复制链接]
发表于 2025-3-20 20:53:16 | 显示全部楼层
效果图显示不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-3-23 13:06:25 | 显示全部楼层
不会

点评

666 666 666 print("666")  发表于 2025-3-23 13:06
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
你期望每列数据对齐输出,问题在于中文字符和英文字符在宽度上有差异,这会影响对齐效果。可以借助 unicodedata 模块来计算字符的宽度,进而实现对齐。
以下是优化后的代码:

import unicodedata

fieldName = ("商品id", "图书名称", "出版社", "价格")
bookData = (
    {"id": "1", "bookName": "资本论(第一卷)",
     "publisher": "人民出版社", "Price": "90"},
    {"id": "2", "bookName": "中华人民共和国简史",
     "publisher": "上海人民出版社", "Price": "40"},
    {"id": "3", "bookName": "百年大党正年轻",
     "publisher": "东方出版社", "Price": "68"},
    {"id": "4", "bookName": "零基础学Python3.0(全彩版)",
     "publisher": "吉林大学出版社", "Price": "79.80"},
    {"id": "5", "bookName": "给Python点颜色 青少年学编程",
     "publisher": "人民邮电出版社", "Price": "59.80"},
)

# 计算每个字段的最大宽度
max_widths = [0] * len(fieldName)
for data in bookData:
    values = [data['id'], data['bookName'], data['publisher'], data['Price']]
    for i, value in enumerate(values):
        width = sum(2 if unicodedata.east_asian_width(c) in 'FW' else 1 for c in value)
        max_widths[i] = max(max_widths[i], width)

# 打印表头
print("┌" + "─" * (max_widths[0] + 2) + "┬" + "─" * (max_widths[1] + 2) + "┬" +
      "─" * (max_widths[2] + 2) + "┬" + "─" * (max_widths[3] + 2) + "┐")
print("│" + fieldName[0].center(max_widths[0] + 2) + "│" +
      fieldName[1].center(max_widths[1] + 2) + "│" +
      fieldName[2].center(max_widths[2] + 2) + "│" +
      fieldName[3].center(max_widths[3] + 2) + "│")
print("├" + "─" * (max_widths[0] + 2) + "┼" + "─" * (max_widths[1] + 2) + "┼" +
      "─" * (max_widths[2] + 2) + "┼" + "─" * (max_widths[3] + 2) + "┤")

# 打印数据
for data in bookData:
    values = [data['id'], data['bookName'], data['publisher'], data['Price']]
    row = "│"
    for i, value in enumerate(values):
        width = sum(2 if unicodedata.east_asian_width(c) in 'FW' else 1 for c in value)
        padding = max_widths[i] - width
        left_padding = padding // 2
        right_padding = padding - left_padding
        if i == 0:
            row += " " * left_padding + value + " " * right_padding + " │"
        elif i == 1:
            row += " " + value.ljust(max_widths[i]) + " │"
        elif i == 2:
            row += " " * left_padding + value + " " * right_padding + " │"
        else:
            row += " " * left_padding + value + " " * right_padding + " │"
    print(row)

# 打印表尾
print("└" + "─" * (max_widths[0] + 2) + "┴" + "─" * (max_widths[1] + 2) + "┴" +
      "─" * (max_widths[2] + 2) + "┴" + "─" * (max_widths[3] + 2) + "┘")





代码解释:
最大宽度计算:借助 unicodedata.east_asian_width 函数算出每个字段的最大宽度,以此保证表格能容纳所有数据。
表头打印:按照最大宽度打印表头,并且用分隔线分隔表头和数据。
数据打印:依据每个字段的最大宽度和实际宽度,对数据进行填充和对齐,确保每列数据对齐。
表尾打印:按照最大宽度打印表尾。
通过上述步骤,能够保证表格中每列数据对齐输出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 02:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表