Как выполнить вложенный список первым - PullRequest
0 голосов
/ 03 октября 2018

Предположим, у меня есть список с вложенными списками и функцией для "НЕ" и "ИЛИ", например, так:

def or_function(exp1, exp2):
    return exp1 or exp2

def not_function(exp): 
    return not exp

my_list = ["NOT", ["NOT", ["NOT", [False, "OR", ["NOT", False]]]]]

Как сначала выполнить самый внутренний список (["NOT", False]), затемвторой самый внутренний ([False, "OR", ["NOT", False]]) и т. д., так что в конце он вернет False?Я понимаю, что здесь может быть полезна двойная рекурсия, но я не могу понять, как ее реализовать.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Если вы уверены, что вы будете получать данные только таким способом, то вы можете попробовать перевернуть список

my_list = reverse(my_list)

, чтобы убедиться, что самый внутренний список ["NOT", False] всегда запускается первым, дайте емувсегда в конце списка

0 голосов
/ 03 октября 2018

Вы можете сделать следующее:

def evaluate(exp):
    if isinstance(exp, bool):  # base case: atomic bools
        return exp
    # ["NOT", whatever]
    if len(exp) == 2 and exp[0] == "NOT":
        # evaluate whatever and negate it!
        return not_function(evaluate(exp[1]))
    if len(exp) == 3 and exp[1] == "OR":
        return or_function(evaluate(exp[0]), evaluate(exp[2]))
    raise ValueError('unknown structure')

>>> my_list = ["NOT", ["NOT", ["NOT", [False, "OR", ["NOT", False]]]]]
>>> evaluate(my_list)
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...