如何在 python 中创建一个字符串解释器,它根据给定的字典键接受命题和 return 答案?
How to create a string interpreter in python that takes propositions and return an answer based on a given dictionary keys?
所以在为这个问题苦苦挣扎了 2 天后,我放弃了。给你两个输入,第一个是包含命题的列表,第二个是字典。
示例:
arg= [<prop1>, "OPERATOR", <prop2>]
dicti= {<prop1>: key1, <prop2394>: key2394,<prop2>:key2}
以下是可能的输入:
arg= [<prop1>, "OPERATOR (AND OR )",
[ "NOT" ,["NOT",<prop2>,"OPERATOR"[<prop2>, "OPERATOR", <prop3>]]]
我敢打赌,如果不使用双重递归,问题将无法解决。这是我解决问题的尝试,我从基本情况开始,输入是“flat”列表,这意味着没有列表作为列表元素的一维列表。程序不应该 return 布尔值,而是字典中给出的 return true
或 false
。
def interpret(arg, keys ):
if not arg :
return "false"
elif not arg and not keys:
return "false"
elif not keys and isinstance(arg,list):
return "true"
elif isinstance(arg[0],list):
return interperter(arg[0:],keys)
else:
trueCnr=0
for i in range(len(arg)):
if arg[i] in keys and keys[arg[i]]=="true":
if isinstance (arg[i], list):
if("NOT" in arg):
indx= arg.index("NOT")
keys[arg[indx+1]]= "true" if keys[arg[indx+1]]=="true" else "false"
trueCnr+=1
print(trueCnr)
if trueCnr==len(arg)-1 and "AND" in arg: return "true"
elif trueCnr!= 0 and "OR" in arg: return "true"
else: return "false"
print (interpret(["door_open", "AND", ["NOT","cat_gone"]], {"door_open" : "false", "cat_gone" : "true", "cat_asleep" : "true"} ))
我的问题是如何从这里开始。
你需要使用递归。定义一个函数 eval(prop, keys)
来评估命题。然后将命题与案例相匹配。例如,
['prop1', 'AND', 'prop2']
如果你看到上面的,你会评价为
return eval(prop[:1], keys) and eval(prop[1:], keys)
一个更复杂的例子:
[ "NOT" ,["NOT",'prop2',"OPERATOR"['prop2', "OPERATOR", 'prop3']]]
看起来像
return not eval(prop[1], keys)
需要注意的是,在每次调用 eval
时,只有一个运算符具有优先权。您的工作是识别是哪个运算符,然后将列表的其余部分传递给其他 eval
调用来处理。
在伪代码中:
def eval(prop, keys):
if not prop:
return False
if prop is a key:
return keys[prop]
if prop has a binary operator:
return eval(stuff before operator) operator eval(stuff after operator)
if prop has unary operator:
return operator eval(stuff after operator)
此外,请注意您必须 return 布尔值 True
和 False
而不是字符串 'True'
和 'False
'
所以在为这个问题苦苦挣扎了 2 天后,我放弃了。给你两个输入,第一个是包含命题的列表,第二个是字典。
示例:
arg= [<prop1>, "OPERATOR", <prop2>]
dicti= {<prop1>: key1, <prop2394>: key2394,<prop2>:key2}
以下是可能的输入:
arg= [<prop1>, "OPERATOR (AND OR )",
[ "NOT" ,["NOT",<prop2>,"OPERATOR"[<prop2>, "OPERATOR", <prop3>]]]
我敢打赌,如果不使用双重递归,问题将无法解决。这是我解决问题的尝试,我从基本情况开始,输入是“flat”列表,这意味着没有列表作为列表元素的一维列表。程序不应该 return 布尔值,而是字典中给出的 return true
或 false
。
def interpret(arg, keys ):
if not arg :
return "false"
elif not arg and not keys:
return "false"
elif not keys and isinstance(arg,list):
return "true"
elif isinstance(arg[0],list):
return interperter(arg[0:],keys)
else:
trueCnr=0
for i in range(len(arg)):
if arg[i] in keys and keys[arg[i]]=="true":
if isinstance (arg[i], list):
if("NOT" in arg):
indx= arg.index("NOT")
keys[arg[indx+1]]= "true" if keys[arg[indx+1]]=="true" else "false"
trueCnr+=1
print(trueCnr)
if trueCnr==len(arg)-1 and "AND" in arg: return "true"
elif trueCnr!= 0 and "OR" in arg: return "true"
else: return "false"
print (interpret(["door_open", "AND", ["NOT","cat_gone"]], {"door_open" : "false", "cat_gone" : "true", "cat_asleep" : "true"} ))
我的问题是如何从这里开始。
你需要使用递归。定义一个函数 eval(prop, keys)
来评估命题。然后将命题与案例相匹配。例如,
['prop1', 'AND', 'prop2']
如果你看到上面的,你会评价为
return eval(prop[:1], keys) and eval(prop[1:], keys)
一个更复杂的例子:
[ "NOT" ,["NOT",'prop2',"OPERATOR"['prop2', "OPERATOR", 'prop3']]]
看起来像
return not eval(prop[1], keys)
需要注意的是,在每次调用 eval
时,只有一个运算符具有优先权。您的工作是识别是哪个运算符,然后将列表的其余部分传递给其他 eval
调用来处理。
在伪代码中:
def eval(prop, keys):
if not prop:
return False
if prop is a key:
return keys[prop]
if prop has a binary operator:
return eval(stuff before operator) operator eval(stuff after operator)
if prop has unary operator:
return operator eval(stuff after operator)
此外,请注意您必须 return 布尔值 True
和 False
而不是字符串 'True'
和 'False
'