将字符串转换为嵌套列表

时间:2018-11-21 18:56:25

标签: python string list for-loop recursion

我希望能够打开字符串,例如:'(* (+ int (+ int real)) int)'
放入嵌套的列表,其中括号是列表的开始/结尾,看起来像这样(在这种情况下)

['*', ['+', 'int', ['+', 'int', 'real']], 'int']

我尝试了以下代码,但没有用

def bracketCheck(el):
if el == ')' or el == '(':
    return False
else:
    return True



def stringIntoList(lst):
lst1 = ''
lst2 = []

for i in range(0, len(lst)-1):
    if bracketCheck(lst[i]):
        lst1 += lst[i]
    elif lst[i] == '(':
        b = stringIntoList(lst[i:])
    elif lst[i] == ')':
        lst2.append(lst1)
        lst2.append(b)
        lst1 = ''
return lst2 

1 个答案:

答案 0 :(得分:0)

您可以使函数跟踪递归调用消耗的子字符串的长度:

def stringIntoList(string):
    output = []
    token = ''
    index = 0
    while index < len(string):
        char = string[index]
        index += 1
        if char in '() ' and token:
            output.append(token)
            token = ''
        if char == '(':
            lst, offset = stringIntoList(string[index:])
            output.append(lst)
            index += offset
        elif char == ')':
            break
        elif char != ' ':
            token += char
    return output, index

这样:

stringIntoList('(* (+ int (+ int real)) int)')[0][0]

返回:

['*', ['+', 'int', ['+', 'int', 'real']], 'int']

请注意,第一个[0]用于获取列表,因为第二项是偏移量,而第二个[0]用于获取列表的第一个子列表,因为您显然假定输入总是以括号开头和结尾。