算术表达式拆分函数报错求助: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 )'))
修复说明
- 数字和小数点直接以字符串存入
temp,避免类型不匹配错误 - 统一处理运算符前的数值,转为浮点型后加入结果列表
- 完善负号判断逻辑:负号在开头,或前面是运算符(非右括号)时,判定为数值符号,存入
temp而非作为运算符 - 新增右括号的处理逻辑
- 函数返回结果而非直接打印,更符合通用使用习惯
测试输出:
[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
相关产品推荐
相关产品推荐

