Python: реализация сложной символьной логической операции

Я хочу сделать следующее, например, логические операции:

Ввод, вывод

##input is string and output is character(A or B or C)
## pre-condition: 'A' < 'B' < 'C'

'A and B'                  -->    'B'
'A or B'                   -->    'A'
'A and B and C'            -->    'C'
'(A or B) and C'            -->    'C'
'A and (B or C)'           -->    'B'
'(A and B) or (B and C)'    -->    'B'
...
...
...

Любые хорошие идеи для реализации этого? Спасибо!!!

Какова логика этой таблицы?

rdas 28.05.2019 17:47

Логические операторы в Python ведут себя точно так же, вам нужно только сначала проанализировать выражение из строки.

mkrieger1 28.05.2019 17:49

@rdas Категории лицензий на программное обеспечение с открытым исходным кодом, основанные на GPL: например, лицензия libksba8 — «(LGPL-3.0+ или GPL-2.0+) и GPL-3.0+ и MIT», я хочу получить категорию (A — это GPLv1 или GPLv1-подобная, B - GPLv2 или GPLv2-подобная, C - GPLv3, выберите минимум), поэтому это "(C или B) и C и A"

piglot 28.05.2019 17:55

@ mkrieger1 да, но логических операторов два: 0 и 1, у меня здесь три: 0, 1, 2?

piglot 28.05.2019 18:00

Если у вас конечное количество таких правил, лучше просто создать таблицу поиска.

rdas 28.05.2019 18:00

Я не понимаю, что вы имеете в виду под «0, 1, 2». Булевы операторы and и or.

mkrieger1 28.05.2019 18:07

Может быть, вы можете попробовать функцию eval? И вам лучше передать dict в качестве параметра globals. Например, eval("(A or B) and C",{"A":"A","B":"B","C":"C"}) возвращает "C"

Tianbo Ji 28.05.2019 18:28

@Tianbo Ji Результат неверный... C and A возвращает 'A', должно быть 'C', C and B возвращает 'B', должно быть 'C'

piglot 29.05.2019 09:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо вам всем. Наконец, я использовал сложные функции для его реализации.

Код:

def char_logic_operation(formula_str):
    ## convert str_formula to list, then make a logic operation
    formula_list = re.findall('\([^\)]*\)|\S+', formula_str)
    formula_list = [i.strip('\(\)').split() if re.match('\([ABC] (and|or) [ABC]\)', i) else i for i in formula_list]
    return nesting_list_logic_operation(formula_list)

def nesting_list_logic_operation(n_list):
    #n_list means nesting list
    if any(isinstance(x, list) for x in n_list):
        for i,v in enumerate(n_list):
            if isinstance(v, list):
                n_list[i] = simple_list_logic_operation(v)
        return nesting_list_logic_operation(n_list)
    else:
        return simple_list_logic_operation(n_list)

def simple_list_logic_operation(s_list):
    #s_list means simple list
    if len(s_list) == 1:
        return s_list[0]
    elif len(s_list) >= 3:
        if s_list[1].lower() == 'and':
            res = max(s_list[0], s_list[2])
        elif s_list[1].lower() == 'or':
            res = min(s_list[0], s_list[2])
        del s_list[:3]
        s_list.insert(0, res)
        return simple_list_logic_operation(s_list)

Тестовое задание:

>>> str1='A and B'
>>> str2='A or B'
>>> str3='A and B and C'
>>> str4='(A or B) and C'
>>> str5='A and (B or C)'
>>> str6='(A and B) or (B and C)'
>>> char_logic_operation(str1)
'B'
>>> char_logic_operation(str2)
'A'
>>> char_logic_operation(str3)
'C'
>>> char_logic_operation(str4)
'C'
>>> char_logic_operation(str5)
'B'
>>> char_logic_operation(str6)
'B'

Другие вопросы по теме