Я хочу сделать следующее, например, логические операции:
##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'
...
...
...
Любые хорошие идеи для реализации этого? Спасибо!!!
Логические операторы в Python ведут себя точно так же, вам нужно только сначала проанализировать выражение из строки.
@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"
@ mkrieger1 да, но логических операторов два: 0 и 1, у меня здесь три: 0, 1, 2?
Если у вас конечное количество таких правил, лучше просто создать таблицу поиска.
Я не понимаю, что вы имеете в виду под «0, 1, 2». Булевы операторы and
и or
.
Может быть, вы можете попробовать функцию eval
? И вам лучше передать dict
в качестве параметра globals
. Например, eval("(A or B) and C",{"A":"A","B":"B","C":"C"})
возвращает "C"
@Tianbo Ji Результат неверный... C and A
возвращает 'A'
, должно быть 'C'
, C and B
возвращает 'B'
, должно быть 'C'
Спасибо вам всем. Наконец, я использовал сложные функции для его реализации.
Код:
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'
Какова логика этой таблицы?