Вы можете заставить функцию отслеживать длины подстрок, которые потребляют рекурсивные вызовы:
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]
предназначен для получения первого подсписка списка, поскольку вы, очевидно, предполагаете, что ваш ввод всегда начинается, изаканчивается скобками.