2010-06-06 3 views
5

Я пишу парсер в Python. Я преобразовал входную строку в список лексем, таких как:Разбиение списка на python

['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')', '/', '3', '.', 'x', '^', '2']

Я хочу, чтобы иметь возможность разделить список на несколько списков, как функция str.split('+'). Но, похоже, нет способа сделать my_list.split('+'). Есть идеи?

Спасибо!

ответ

8

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

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.

+3

[Python Lex-Yacc (PLY)] (http://www.dabeaz.com/ply/) и [PyPEG] (http://fdik.org/pyPEG/) тоже хороши. – exupero

1

Быстрый взлом, вы можете сначала использовать метод .join() для создания строки из списка, разделить ее на «+», переразделить (это создает матрицу), а затем использовать список() способ дополнительно разделить каждый элемент в матрице на отдельные маркеры

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']] 
+0

Это, вероятно, не делает то, что он хочет для 'a = ['12', '+', '34']'. –

+0

ты прав, не думал об этом – momo

Смежные вопросы