我需要轉換具有以下類結構的樹:
Class Tree:
def __init__(self, data):
self.data = data
self.and_objects = []
self.or_objects = []
資料在哪里:
Class Data:
def __init__(self, var, operator, value):
self.var = var
self.operator = operator
self.value = value
def to_json(self):
return {"var": self.var, "operator": self.operator, "value": self.value}
資料結構的簡化示例:
Root
andChildren
x = 0
andChildren
a = 1
b = 2
y = 10
andChildren
a = 3
orChildren
y = 3
andChildren
a = 2
orChildren
Empty
評估為:
((x == 0 and (a == 1 and b == 2)) and ((y == 10 and (a == 3)) or (y == 3 and a == 2))
I need to convert the tree data structure to:
{
"Search":{
"Root":{
"compare_operator":"and",
"values":[
{
"compare_operator":"and",
"values":[
{
"var":"x",
"operator":"=",
"value":"0"
},
{
"compare_operator":"and",
"values":[
{
"var":"a",
"operator":"=",
"value":"1"
},
{
"var":"b",
"operator":"=",
"value":"2"
}
]
}
]
},
{
"compare_operator":"or",
"values":[
{
"compare_operator":"and",
"values":[
{
"var":"y",
"operator":"=",
"value":"10"
},
{
"var":"a",
"operator":"=",
"value":"3"
}
]
},
{
"compare_operator":"and",
"values":[
{
"var":"y",
"operator":"=",
"value":"3"
},
{
"var":"a",
"operator":"=",
"value":"2"
}
]
}
]
}
]
}
}
}
Does anyone have any tips/methods on how to transform this tree data structure to this json structure?
I've tried a couple recursive algorithms, but I can not get them to yield the JSON output needed.
The script that recreates this structure:
Class Tree:
def __init__(self, data="root"):
self.data = data
self.and_objects = []
self.or_objects = []
Class Data:
def __init__(self, var, operator, value):
self.var = var
self.operator = operator
self.value = value
def to_json(self):
return {"var": self.var, "operator": self.operator, "value": self.value}
def create_search(var, operator, value, parent, comparision="and")
data = Data(var, operator, value)
child = Tree(data)
if comparision == "and":
parent.and_objects.append(child)
else:
parent.or_objects.append(child)
return child
if __name__ == "__main__":
root_tree = Tree()
x_temp = create_search("x", "=", "0", root_tree)
create_search("a", "=", "1", x_temp)
create_search("b", "=", "2", x_temp)
y_temp = create_search("y", "=", "10", root_tree)
create_search("a", "=", "3", root_tree, y_temp)
nested_y_temp = create_search("y", "=", "3", root_tree, y_temp, "or")
create_search("a", "=", "2", root_tree, nested_y_temp)
# tree data is on root_tree
uj5u.com熱心網友回復:
我會選擇不同的初始結構。在您的結構中,AND 或 OR 運算子需要有一個 Data 實體作為父級。并且 Data 實體與依賴于它的 AND 和 OR 串列結合在一起。
我建議允許將所有運算元作為子級的頂級 AND 或 OR 運算子。您還可以為 AND 和 OR 運算子以及 EQUALITY 運算子創建單獨的類。
這是看起來的樣子:
class Logical():
def __init__(self, operator, operands):
self.operands = operands
self.operator = operator
def __str__(self):
return f" {self.operator} ".join(map(str, self))
def asdict(self):
return {
"compare_operator": self.operator,
"values": [operand.asdict() for operand in self.operands]
}
class And(Logical):
def __init__(self, *operands):
super().__init__("and", operands)
class Or(Logical):
def __init__(self, *operands):
super().__init__("or", operands)
class Condition:
def __init__(self, var, operator, value):
self.var = var
self.operator = operator
self.value = value
def asdict(self):
return {
"var": self.var,
"operator": self.operator,
"value": self.value
}
class Equal(Condition):
def __init__(self, var, value):
super().__init__(var, "=", value)
創建結構的示例:
expression = And(
And(
Equal("x", 0),
And(
Equal("a", 1),
Equal("b", 2),
),
),
Or(
And(
Equal("y", 10),
Equal("a", 3)
),
And(
Equal("y", 3),
Equal("a", 2)
)
)
)
將其轉換為 JSON:
import json
result = {
"Search": {
"Root": expression.asdict()
}
}
print(json.dumps(result, indent=4))
這列印:
{
"Search": {
"Root": {
"compare_operator": "and",
"values": [
{
"compare_operator": "and",
"values": [
{
"var": "x",
"operator": "=",
"value": 0
},
{
"compare_operator": "and",
"values": [
{
"var": "a",
"operator": "=",
"value": 1
},
{
"var": "b",
"operator": "=",
"value": 2
}
]
}
]
},
{
"compare_operator": "or",
"values": [
{
"compare_operator": "and",
"values": [
{
"var": "y",
"operator": "=",
"value": 10
},
{
"var": "a",
"operator": "=",
"value": 3
}
]
},
{
"compare_operator": "and",
"values": [
{
"var": "y",
"operator": "=",
"value": 3
},
{
"var": "a",
"operator": "=",
"value": 2
}
]
}
]
}
]
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455705.html
上一篇:如何獲取嵌套串列中的所有元素,其中每個串列的第一個元素是特定數字?
下一篇:對稱關系遞回SML
