例如,我需要
listBuilder('24+3-65*2')
回来
['24', '+', '3', '-', '65', '*', '2']
我们不允许使用自定义导入的功能。没有他们我必须做这项工作。这就是我到目前为止......
def listBuilder(expr):
operators = ['+', '-', '*', '/', '^']
result = []
temp = []
for i in range(len(expr)):
if expr[i] in operators:
result.append(expr[i])
elif isNumber(expr[i]): #isNumber() returns true if the string can convert to float
temp += expr[i]
if expr[i+1] in operators:
tempTwo = ''.join(temp)
result.append(tempTwo)
temp = []
tempTwo = []
elif expr[i+1] == None:
break
else:
continue
return result
此时我收到错误,字符串索引超出了包含expr[i+1]
的行的范围。非常感谢帮助。我被困在这几个小时。
答案 0 :(得分:1)
您正在迭代列表的所有组件(包括最后一项),然后测试下一项是否为运算符。这意味着当你的循环到达最后一个项目时,没有其他项目要测试,因此索引错误。
请注意,操作符永远不会出现在表达式的末尾。也就是说,你不会得到像2+3-
这样的东西,因为它没有意义。因此,您可以测试除最后一项之外的所有项目:
for idx, item in enumerate(expr):
if item in operators or (idx == len(expr)-1):
result.append(item)
elif idx != len(expr)-1:
temp += item
if expr[idx+1] in operators:
tempTwo = ''.join(temp)
result.append(tempTwo)
temp = []
tempTwo = []
elif expr[idx+1] == None:
break
else:
continue
答案 1 :(得分:0)
我不确定这是否是最佳解决方案,但在特定情况下有效。
operators = ['+', '-', '*', '/', '^']
s = '24+3-65*2/25'
result = []
temp = ''
for c in s:
if c.isdigit():
temp += c
else:
result.append(temp)
result.append(c)
temp = ''
# append the last operand to the result list
result.append(temp)
print result
# Output: ['24', '+', '3', '-', '65', '*', '2', '/', '25']
答案 2 :(得分:0)
我想出了一个更简洁的函数版本,它避免使用字符串指示,这在Python中更快。
您的代码抛出了索引错误,因为在最后一次迭代中,您正在检查位置i + 1处的内容,这是列表末尾的内容。这条线
if expression[i+1] in operators:
抛出错误,因为在最后一次迭代期间,我是最终列表索引,并检查不存在的列表项。
def list_builder(expression):
operators = ['+','-','*','/','^']
temp_string = ''
results = []
for item in expression:
if item in operators:
if temp_string:
results.append(temp_string)
temp_string = ''
results.append(item)
else:
if isNumber(item):
temp_string = ''.join([temp_string, item])
results.append(temp_string) #Put the last token in results
return results