要列出的整数的字符串

时间:2017-12-03 07:21:14

标签: python list grouping

例如,我需要 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]的行的范围。非常感谢帮助。我被困在这几个小时。

3 个答案:

答案 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