在 Python 的嵌套列表中提取子列表

Extracting sublists in a nested list in Python

给定如下字符串:'~a & ~b & (~c | ~a) -> c'

我希望生成一个包含此语句的所有子语句的列表,即:

- (~c|~a)
- ~a & ~b & (~c | ~a)
- ~a & ~b & (~c | ~a) -> c

进入列表。我已经有一个能够找到的解析器:

- [[['~', 'a', '&', '~', 'b', '&', ['~', 'c', '|', '~', 'a']], '@', 'c']]

从这里我希望将每个列表按顺序压缩成自己的语句并将它们中的每一个评估为子列表,即我想在上面的列表中找到:

- ['~', 'c', '|', '~', 'a']
- ['~', 'a', '&', '~', 'b', '&', ['~', 'c', '|', '~', 'a']]
- [[['~', 'a', '&', '~', 'b', '&', ['~', 'c', '|', '~', 'a']], '@', 'c']]

任何人都可以就如何完成此任务给我建议吗?我想递归地这样做,但我一直无法想出解决方案。

我的总体目标是制作一个布尔表达式求值器,因此如果有人对此也有指导,我们将不胜感激。

幸运的是,这是一个非常容易设置的递归:

x = [[['~', 'a', '&', '~', 'b', '&', ['~', 'c', '|', '~', 'a']], '@', 'c']]

def sublists(outerlist):
    ret = []
    for x in outerlist:
        if isinstance(x, list):
            ret.append(x)
            ret.extend(sublists(x))
    return ret

print "\n".join("{0}".format(l) for l in sublists(x))

这会打印:

[['~', 'a', '&', '~', 'b', '&', ['~', 'c', '|', '~', 'a']], '@', 'c']
['~', 'a', '&', '~', 'b', '&', ['~', 'c', '|', '~', 'a']]
['~', 'c', '|', '~', 'a']