请求协助完成Python算术题排版函数的字符串格式化与填充调整
解决算术题排版格式问题
看起来你已经完成了大部分核心逻辑,主要问题出在固定宽度的使用和动态对齐的处理上。我帮你调整了代码,现在可以完美实现你想要的输出格式:
def arithmetic_arranger(problems, display_result=False): if len(problems) > 5: return "Error: Too many problems." first_operand = [] operator = [] second_operand = [] result = [] for eq in problems: eq_splitted = eq.split() # 检查操作数是否为纯数字 if not eq_splitted[0].isnumeric() or not eq_splitted[2].isnumeric(): return "Error: Numbers must only contain digits." # 检查运算符是否合法 if eq_splitted[1] not in ["+", "-"]: return "Error: Operator must be '+' or '-'." # 检查数字长度不超过4位 if len(eq_splitted[0]) > 4 or len(eq_splitted[2]) > 4: return "Error: Numbers cannot be more than four digits." first_operand.append(eq_splitted[0]) operator.append(eq_splitted[1]) second_operand.append(eq_splitted[2]) # 安全计算结果,替代eval if eq_splitted[1] == '+': res = str(int(eq_splitted[0]) + int(eq_splitted[2])) else: res = str(int(eq_splitted[0]) - int(eq_splitted[2])) result.append(res) # 初始化存储每行片段的列表 first_line_parts = [] second_line_parts = [] sep_line_parts = [] res_line_parts = [] for i in range(len(problems)): first = first_operand[i] op = operator[i] second = second_operand[i] res = result[i] # 动态计算每个问题的宽度:最长操作数长度 + 2(运算符+空格) width = max(len(first), len(second)) + 2 # 生成各部分的格式化字符串 first_line_parts.append(f"{first:>{width}}") second_line_parts.append(f"{op} {second:>{width-2}}") sep_line_parts.append('-' * width) res_line_parts.append(f"{res:>{width}}") # 用4个空格连接每个问题的片段,组成完整行 first_line = ' '.join(first_line_parts) second_line = ' '.join(second_line_parts) sep_line = ' '.join(sep_line_parts) # 根据display_result决定最终输出内容 if display_result: res_line = ' '.join(res_line_parts) arranged = '\n'.join([first_line, second_line, sep_line, res_line]) else: arranged = '\n'.join([first_line, second_line, sep_line]) return arranged # 测试示例 print(arithmetic_arranger(["32 + 8", "1 - 3801", "9999 + 9999", "523 - 49"], True)) print("\n") print(arithmetic_arranger(["32 + 698", "1 - 2", "45 + 43", "123 + 2249"]))
关键修改点说明:
修正错误检查:
- 修复了重复检查第二个操作数长度的问题,现在同时校验两个操作数的长度是否超4位
- 补充了第二个操作数的纯数字检查(你之前只检查了第一个,存在遗漏)
动态宽度计算:
- 不再使用固定的6位宽度,而是根据每个问题中最长的操作数长度动态计算宽度(
width = max(len(first), len(second)) + 2),完美适配不同长度的数字
- 不再使用固定的6位宽度,而是根据每个问题中最长的操作数长度动态计算宽度(
灵活的片段拼接:
- 用列表存储每个问题的各行片段,再用4个空格连接,替代原来的制表符
\t,保证问题之间的间距完全一致 - 分隔线根据每个问题的宽度生成对应长度的短横线,确保和上下内容对齐
- 用列表存储每个问题的各行片段,再用4个空格连接,替代原来的制表符
结果行对齐:
- 结果同样按照对应问题的宽度右对齐,保证和上面的数字、分隔线完美匹配
安全的结果计算:
- 替换了
eval(eq),改用显式的加减计算,避免了eval带来的潜在安全风险
- 替换了
现在运行代码,就能得到你期望的输出格式了。
内容的提问来源于stack exchange,提问作者Adarsh Namdev
相关产品推荐
相关产品推荐

