Извлечение подсписков во вложенном списке в Python - PullRequest
0 голосов
/ 18 сентября 2018

Учитывая строку типа: '~ 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']]

Может ли кто-нибудь дать мне совет, как этого добиться? Я хочу сделать это рекурсивно, но я не смог найти решение.

Моя общая цель - создать средство оценки логических выражений, поэтому, если у кого-то есть рекомендации по этому вопросу, это будет оценено.

1 Ответ

0 голосов
/ 18 сентября 2018

К счастью, это довольно легко настроить:

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']
...