这是我在这里的第一篇文章,我希望我的问题是明确的,格式正确。。。你知道吗
我有两本字典。第一个字典包含我称之为“选项表达式”的键和值的任意项:
dict1 = {'((opt1 OR opt4 OR opt6) AND NOT opt7)': 'Yellow Roof', '((opt2 AND opt3) XOR opt5': 'Purple Scooter'}
print(dict1)
{'((opt1 OR opt4 OR opt6) AND NOT opt7)': 'Yellow Roof',
'((opt2 AND opt3) XOR opt5': 'Purple Scooter'}
第二个字典包含来自dict1
的选项作为键,以及它们是否作为值“接受”或“拒绝”:
dict2 = {'opt1': 'Accepted', 'opt2': 'Rejected', 'opt3': 'Rejected','opt4': 'Accepted', 'opt5': 'Accepted', 'opt6': 'Rejected','opt7': 'Accepted'}
print(dict2)
{'opt1': 'Accepted',
'opt2': 'Rejected',
'opt3': 'Rejected',
'opt4': 'Accepted',
'opt5': 'Accepted',
'opt6': 'Rejected',
'opt7': 'Accepted'}
我将如何评估来自dict1
的表达式作为True
或False
来根据来自dict2
的opt是被接受还是被拒绝来确定选择了哪些项?你知道吗
我最初的想法是将表达式中的opt替换为1表示accepted,0表示rejected,这样可以得到如下结果:
((1 OR 1 OR 0) AND NOT 1)
其计算结果为False
以及
((0 AND 0) XOR 1)
将作为True
计算
我对pyparsing做了一些研究,认为它在这里会很有用,尽管我不完全确定如何最好地利用它。你知道吗
我正在应用布尔逻辑:
并且:当且仅当双方都是真的时才是真的
或:如果任何一方为真,则为真
NOT/(AND NOT):由真变假,由假变真
XOR:如果一方为真,则为真(但是 不两者)
我想出了一个解决办法。它假设您已经用True和False替换了“Accepted”和“Rejected”(或您在问题中所说的1和0)
然后将处理结果。它首先将结果格式化为有效的Python代码('xor'->;
^
'和'->;and
和'OR'->;or
),用布尔值替换opt值,最后使用eval
内置函数计算表达式。你知道吗我倾向于回避使用
eval
和exec
,但我认为这是这种情况下最快的解决方案。你知道吗只需对数据稍加处理,就可以将其转换为有效的Python,并让Python解释器执行您的命令:
相关问题 更多 >
编程相关推荐