Превращение строки во вложенный список - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу иметь возможность превратить строки , например: '(* (+ 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 голосов
/ 21 ноября 2018

Вы можете заставить функцию отслеживать длины подстрок, которые потребляют рекурсивные вызовы:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...