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

请求协助完成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"]))

关键修改点说明:

  1. 修正错误检查:

    • 修复了重复检查第二个操作数长度的问题,现在同时校验两个操作数的长度是否超4位
    • 补充了第二个操作数的纯数字检查(你之前只检查了第一个,存在遗漏)
  2. 动态宽度计算:

    • 不再使用固定的6位宽度,而是根据每个问题中最长的操作数长度动态计算宽度(width = max(len(first), len(second)) + 2),完美适配不同长度的数字
  3. 灵活的片段拼接:

    • 用列表存储每个问题的各行片段,再用4个空格连接,替代原来的制表符\t,保证问题之间的间距完全一致
    • 分隔线根据每个问题的宽度生成对应长度的短横线,确保和上下内容对齐
  4. 结果行对齐:

    • 结果同样按照对应问题的宽度右对齐,保证和上面的数字、分隔线完美匹配
  5. 安全的结果计算:

    • 替换了eval(eq),改用显式的加减计算,避免了eval带来的潜在安全风险

现在运行代码,就能得到你期望的输出格式了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:44:06