如何格式化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库(简洁高效)
借助第三方库自动适配列宽,输出规整表格:
- 安装库:
pip install tabulate - 代码实现:
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
相关产品推荐
相关产品推荐

