Python字符串数字与运算符分离函数输出异常问题排查
问题分析与修复
咱们直接揪出你代码里的核心问题——判断数字的条件逻辑完全错误,这也是第二个测试用例失败的根本原因。
为什么第二个测试用例出错?
你写的cond1 = runes[i-1] >"-1" and runes[i-1] < "10"是用字符串比较来判断字符是否为数字,但Python的字符串比较是按Unicode码点逐个比对的,和数字比较逻辑完全不一样:
- 比如字符
'3'和字符串"10"比较时,Python会先比第一个字符:'3'的码点是51,'1'的码点是49,所以'3' > '1',导致"3" < "10"的结果是False。 - 在第二个测试用例
"123*456=56088"中,当循环到*的位置(i=3)时,前一个字符是'3',此时cond1的后半部分不成立,所以不会更新index1,index1保持初始值0。最终代码把runes[0]也就是'1'当成了运算符,自然输出完全错误。
为什么移除cond1/cond2后第二个用例正常,但其他用例出错?
移除条件后,代码会把所有遇到的运算符都记录为index1,第二个测试用例里只有一个*,所以能正确找到它的位置。但像第三个测试用例"-58*-1=50"里有两个'-'(一个是负号,属于数字的一部分),代码会把第一个'-'当成二元运算符,导致num1为空、运算符错误,这显然不符合需求。
修复方案
正确的做法是用字符的isdigit()方法判断是否为数字,同时还要避免循环时i=0导致i-1=-1(取到字符串最后一个字符)的错误:
def separator(runes): operators = ["-", "+", "/", "*"] op_index = None eq_index = None # 寻找二元运算符的位置:前面是数字或?的运算符 for i in range(1, len(runes)): # 从i=1开始,避免i-1越界 if runes[i] in operators: prev_char = runes[i-1] if prev_char.isdigit() or prev_char == "?": op_index = i break # 假设表达式只有一个二元运算符,找到即停止 # 寻找等号的位置 for i in range(len(runes)): if runes[i] == "=": eq_index = i break # 提取各部分并转为字符串 num1 = ''.join(runes[:op_index]) if op_index is not None else "" operator = runes[op_index] if op_index is not None else "" num2 = ''.join(runes[op_index+1:eq_index]) if op_index and eq_index else "" result = ''.join(runes[eq_index+1:]) if eq_index is not None else "" return num1, operator, num2, result
测试验证
运行你的测试用例会得到正确结果:
print(separator("1+1=2")) # ('1', '+', '1', '2') print(separator("123*456=56088")) # ('123', '*', '456', '56088') print(separator("-58*-1=50")) # ('-58', '*', '-1', '50')
这个修复后的代码能正确区分数字的负号和二元运算符,同时准确提取表达式的各个部分。
内容的提问来源于stack exchange,提问作者Labahang Limbu
相关产品推荐
相关产品推荐

