[英]How do I deal with a logical expression in Python?
假設我得到了ie格式的邏輯表達式。 AvBv~C->D
它由布爾元素和運算符組成,如(v,~,->)
(disjunction,negation,implication)。 我需要存儲這些表達式及其包含的每個元素。 此外,每個元素都應該有一個描述,所以我想我必須創建一個代表它們的類(帶有字段representation
和description
即element1.representation="A"
和element1.description="This is element A"
但我是不確定這是否是pythonic方式,也許一個名稱和描述為列的2D數組將是一個更好的主意,因為名稱都是唯一的。
請原諒我,如果我不太清楚,但我來自Java,我無法在同一數據結構中存儲不同類型的元素。
例如,連接可以表示如下,類似的方法可以用於變量:
class Node:
operator = "AND"
left_node = None
right_node = None
description = "text"
value = None
class Node:
operator = "VAR"
left_node = None
right_node = None
description = "text"
value = "B"
然后,您可以從這些節點中組合樹。
例如: A^B
可以表示為具有AND
的Node
AND
其中left_node
是VAR
節點( value=A
),而right_node
也是VAR
節點( value=B
)。
通過聲明__and__
, __or__
和__invert__
方法,你可以用&
, |
和~
運算符來定義表達式。
class Element(object):
def __init__(self, elt_id, elt_description=None):
self.id = elt_id
self.description = elt_description
if self.description is None:
self.description = self.id
def __or__(self, elt):
return CombinedElement(self, elt, op="OR")
def __and__(self, elt):
return CombinedElement(self, elt, op="AND")
def __invert__(self):
return CombinedElement(self, op="NOT")
def __str__(self):
return self.id
class CombinedElement(Element):
def __init__(self, elt1, elt2=None, op="NOT"):
# ID1
id1 = elt1.id
if isinstance(elt1, CombinedElement):
id1 = '('+id1+')'
# ID2
if elt2 is not None:
id2 = elt2.id
if isinstance(elt2, CombinedElement):
id2 = '('+id2+')'
# ELT_ID
if op == "NOT" and elt2 is None:
elt_id = "~"+id1
elif op == "OR":
elt_id = id1+" v "+id2
elif op == "AND":
elt_id = id1+" ^ "+id2
# SUPER
super(CombinedElement, self).__init__(elt_id)
a = Element("A")
b = Element("B")
c = Element("C")
d = Element("D")
e = Element("E")
print(a&b|~(c&d)|~e)
輸出:
((A ^ B) v (~(C ^ D))) v (~E)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.