You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何格式化Python条件语句输出为规整表格并适配长姓名

联合授课班级成绩规整输出问题解决

问题背景

需要为联合授课班级计算成绩并输出规整的表格格式,现有Python代码可正常运行但格式不符合要求,调整格式化代码后,仍存在长姓名会挤乱成绩列位置的问题。

原始代码

n,s,p = input("Input your Name, section, and points separated by a comma").split(",")
st= float(s)
po= float(p)
if st == 435:
    grade = (po/600)*100
    if grade < 60:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "F")
    elif grade >= 60:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "D")
    elif grade >= 70:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "C")
    elif grade >= 80:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "B")
    elif grade >= 90:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "A")
elif st == 535:
    grade = (po/700)*100
    if grade < 60:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "F")
    elif grade >= 60:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "D")
    elif grade >= 70:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "C")
    elif grade >= 80:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "B")
    elif grade >= 90:
        print("SECTION", "STUDENT", "GRADE")
        print("GSP", s, "A") 

修改后仍有问题的代码

n,s,p = input("Input your Name, section, and points separated by a comma").split(",")

st= float(s)
po= float(p)
if st == 435:
    grade = (po/600)*100
    if grade < 60:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+s,n, "F"))
    elif 60 <= grade < 70:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+s,n, "D"))
    elif 70 <= grade < 80:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+s,n, "C"))
    elif 80 <= grade < 90:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+s,n, "B"))
    elif 90 <= grade < 100:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+s,n, "A"))

elif st == 535:
    grade = (po/700) * 100
    if grade < 60:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+ s, n, "F"))
    elif 60 <= grade < 70:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+ s, n, "D"))
    elif 70 <= grade < 80:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+ s, n, "C"))
    elif 80 <= grade < 90:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+ s, n, "B"))
    elif 90 <= grade < 100:
        print("SECTION", "STUDENT", "GRADE")
        print('{:7s} {:7s} {:5s}'.format("GSP "+ s, n, "A"))

问题原因

修改后的代码使用固定宽度格式化字符串(如{:7s}),当姓名长度超过设定的7个字符时,会突破宽度限制,导致后续列错位。同时原代码等级判断逻辑存在覆盖问题(如elif grade >=60会跳过70/80/90的判断)。

解决方案

方案1:动态计算列宽度(无依赖)

根据输入姓名和表头的长度动态调整列宽,确保所有内容对齐:

n,s,p = input("输入姓名、班级、分数,用逗号分隔").split(",")
st = float(s)
po = float(p)

# 计算百分比成绩
if st == 435:
    grade_percent = (po / 600) * 100
elif st == 535:
    grade_percent = (po / 700) * 100
else:
    print("无效班级")
    exit()

# 确定等级字母(修复原逻辑覆盖问题)
if grade_percent < 60:
    grade_letter = "F"
elif 60 <= grade_percent <70:
    grade_letter = "D"
elif 70 <= grade_percent <80:
    grade_letter = "C"
elif 80 <= grade_percent <90:
    grade_letter = "B"
else:
    grade_letter = "A"

# 动态计算列宽:取内容和表头的最大长度+2留余量
section_col_width = max(len(f"GSP {s}"), len("SECTION")) + 2
name_col_width = max(len(n), len("STUDENT")) + 2
grade_col_width = max(len(grade_letter), len("GRADE")) + 2

# 格式化输出表头和内容
header = f"{{:<{section_col_width}}}{{:<{name_col_width}}}{{:<{grade_col_width}}}".format("SECTION", "STUDENT", "GRADE")
content = f"{{:<{section_col_width}}}{{:<{name_col_width}}}{{:<{grade_col_width}}}".format(f"GSP {s}", n, grade_letter)

print(header)
print(content)

方案2:使用tabulate库(简洁高效)

借助第三方库自动适配列宽,输出规整表格:

  1. 安装库:pip install tabulate
  2. 代码实现:
from tabulate import tabulate

n,s,p = input("输入姓名、班级、分数,用逗号分隔").split(",")
st = float(s)
po = float(p)

# 计算百分比成绩
if st == 435:
    grade_percent = (po / 600) * 100
elif st == 535:
    grade_percent = (po / 700) * 100
else:
    print("无效班级")
    exit()

# 确定等级字母
if grade_percent < 60:
    grade_letter = "F"
elif 60 <= grade_percent <70:
    grade_letter = "D"
elif 70 <= grade_percent <80:
    grade_letter = "C"
elif 80 <= grade_percent <90:
    grade_letter = "B"
else:
    grade_letter = "A"

# 用tabulate输出规整表格
table_data = [
    ["SECTION", "STUDENT", "GRADE"],
    [f"GSP {s}", n, grade_letter]
]
print(tabulate(table_data, headers="firstrow", tablefmt="plain"))

内容的提问来源于stack exchange,提问作者PieCharmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:15:42