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