将复杂的树结构转换为Json Python
我需要转换具有以下类结构的树:
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和(a == 1 and B == 2)) )和((y == 10和(a == 3))或(y == 3和a == 2))
我需要将树数据结构转换为:
{
"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"
}
]
}
]
}
]
}
}
}
有人有任何提示/方法关于如何将这棵树数据结构转换为此JSON
结构
?
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
I need to convert a Tree with the following class structure:
Class Tree:
def __init__(self, data):
self.data = data
self.and_objects = []
self.or_objects = []
Where the data is:
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}
A simplified example of the data structure:
Root
andChildren
x = 0
andChildren
a = 1
b = 2
y = 10
andChildren
a = 3
orChildren
y = 3
andChildren
a = 2
orChildren
Empty
This evaluates to:
((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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我会选择不同的初始结构。在您的结构中,AND 或 OR 运算符需要有一个 Data 实例作为父级。数据实例与依赖于它的两者以及 AND 和 OR 列表组合在一起。
我建议允许顶级 AND 或 OR 运算符将其所有操作数作为子项。您还可以为 AND 和 OR 运算符以及 EQUALITY 运算符创建单独的类。
将
结构的创建示例:
其转换为 JSON:
这将打印:
I would go for a different initial structure. In your structure an AND or OR operator needs to have a Data instance as parent. And a Data instance is combined with both and AND and OR list that depends on it.
I would suggest to allow for a top-level AND or OR operator that has all its operands as children. You could also create separate classes for AND and OR operators, and for EQUALITY operator as well.
Here is how that would look:
Example creation of a structure:
Turning it to JSON:
This prints: