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

算术表达式拆分函数报错求助:TypeError问题排查与功能实现

算术表达式拆分问题及修复方案

需求说明

需要实现一个split函数,将算术表达式拆分为包含数值项(浮点型)与运算符的列表,示例如下:
输入:

split('2.1     * -5    + 3    ^ 2 +     1 +    -4.45')

预期输出:

[2.1,'*',-5.0,'+',3.0,'^',2.0,'+',1.0,'+',-4.45]

现有代码及报错

现有代码

ops = ('+','-','*','/','^','(')

def split(txt):
    final = []
    temp = []
    inp = "".join(txt.split())
    for x in inp:
        if x.isdigit():
            temp.append(int(x))
        elif x == '.':
            temp.append(x)
        elif x in ops:
            if x == '-':
                if len(temp) == 0:
                    if isinstance(final[-1],float):
                        final.append(float("".join(temp)))
                        final.append(x)
                        temp = []
                    else:
                        temp.append(x)
                else:
                    final.append(float("".join(temp)))
                    final.append(x)
                    temp = []
            else:
                final.append("".join(temp))
                final.append(x)
                temp = []
    final.append(float("".join(temp)))
    print(final)

报错信息

Traceback (most recent call last):
  File "C:\Users\Sahil Prusti\Desktop\cmpsc132\HW 3\hwtest.py", line 32, in <module>
    print(split('2* (       -5.2 + 3 ) ^2+ ( 1 +4 )'))
  File "C:\Users\Sahil Prusti\Desktop\cmpsc132\HW 3\hwtest.py", line 26, in split
    final.append("".join(temp))
TypeError: sequence item 0: expected str instance, int found

问题分析

报错核心原因:代码中遇到数字字符时,将其转为int类型存入temp列表,而"".join()方法仅能拼接字符串元素,类型不匹配导致报错。

除此之外,现有代码还有多处逻辑缺陷:

  • 负号处理逻辑混乱,空列表时访问final[-1]会触发索引越界错误
  • 部分分支直接将temp拼接成字符串加入结果,未转为浮点型
  • 未处理右括号)
  • 多位数、带负号的数值处理逻辑不完善

修复后的代码

ops = ('+', '-', '*', '/', '^', '(', ')')

def split(txt):
    final = []
    temp = []
    inp = "".join(txt.split())
    n = len(inp)
    for i, x in enumerate(inp):
        if x.isdigit() or x == '.':
            temp.append(x)
        elif x in ops:
            # 处理运算符前的数值
            if temp:
                final.append(float("".join(temp)))
                temp = []
            # 区分负号(数值符号)和减号(运算符)
            if x == '-' and (i == 0 or inp[i-1] in ops and inp[i-1] != ')'):
                temp.append(x)
            else:
                final.append(x)
    # 处理最后一个剩余的数值
    if temp:
        final.append(float("".join(temp)))
    return final

# 测试示例
print(split('2.1     * -5    + 3    ^ 2 +     1 +    -4.45'))
print(split('2* (       -5.2 + 3 ) ^2+ ( 1 +4 )'))

修复说明

  1. 数字和小数点直接以字符串存入temp,避免类型不匹配错误
  2. 统一处理运算符前的数值,转为浮点型后加入结果列表
  3. 完善负号判断逻辑:负号在开头,或前面是运算符(非右括号)时,判定为数值符号,存入temp而非作为运算符
  4. 新增右括号的处理逻辑
  5. 函数返回结果而非直接打印,更符合通用使用习惯

测试输出:

[2.1, '*', -5.0, '+', 3.0, '^', 2.0, '+', 1.0, '+', -4.45]
[2.0, '*', '(', -5.2, '+', 3.0, ')', '^', 2.0, '+', '(', 1.0, '+', 4.0, ')']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:15:59