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

问题描述 投票:1回答:1

给定一个字符串:'~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']]

谁能给我建议如何实现这个目标?我想以递归方式这样做,但我无法提出解决方案。

我的总体目标是制作一个布尔表达式评估器,所以如果有人对此有指导,那么我们将不胜感激。

python list boolean-expression
1个回答
1
投票

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

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']
© www.soinside.com 2019 - 2024. All rights reserved.