Я пишу синтаксический анализатор в Python. Я преобразовал входную строку в список маркеров, таких как:
['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')', '/', '3', '.', 'x', '^', '2']
Я хочу смочь разделить список на несколько списков, как str.split('+')
функция. Но, кажется, нет способа сделать my_list.split('+')
. Какие-либо идеи?
Спасибо!
Вы можете довольно легко написать свою собственную функцию разделения для списков, используя yield:
def split_list(l, sep):
current = []
for x in l:
if x == sep:
yield current
current = []
else:
current.append(x)
yield current
Альтернативный способ - использовать list.index
и перехватить исключение:
def split_list(l, sep):
i = 0
try:
while True:
j = l.index(sep, i)
yield l[i:j]
i = j + 1
except ValueError:
yield l[i:]
Вы можете вызвать его в любом случае вот так:
l = ['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')',
'/', '3', '.', 'x', '^', '2']
for r in split_list(l, '+'):
print r
Результат:
['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')']
['4', ')', '/', '3', '.', 'x', '^', '2']
Для синтаксического анализа в Python вы также можете посмотреть что-то вроде pyparsing .
быстрый взлом, вы можете сначала использовать метод .join (), чтобы создать строку из вашего списка, разделить ее на '+', повторно разделить (это создает матрицу), затем используйте метод list () для дальнейшего разделения каждого элемента в матрице на отдельные токены
a = ['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')', '/', '3', '.', 'x', '^', '2']
b = ''.join(a).split('+')
c = []
for el in b:
c.append(list(el))
print(c)
результат:
[['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')'], ['4', ')', '/', '3', '.', 'x', '^', '2']]