在Python中如何拆分列表

5
我正在使用Python编写解析器。我已经将输入字符串转换成包含以下标记的列表:
['(', '2', '.', 'x', '.', '(', '3', '-', '1', ')', '+', '4', ')', '/', '3', '.', 'x', '^', '2']
我希望能够将该列表分割成多个列表,就像str.split('+')函数一样。但是似乎没有办法执行my_list.split('+')。有什么想法吗?
谢谢!
2个回答

8

您可以使用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这样的工具。


3
Python Lex-Yacc (PLY)和PyPEG也很不错。 - exupero

1

一个快速的技巧是,你可以先使用 .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']]

对于 a = ['12', '+', '34'],这可能不会做他想要的事情。 - Mark Byers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接