将JSON逻辑遍历成语句
Traverse JSON logic into a statement
JSON 输入为:
{
"AND":
[
{"OR": [ { "EQUALS" : {"X":"Y"} }, { "EQUALS": {"Z":"W"} } ]},
{"EQUALS" : {"A": "B"} }
]
}
EQUALS 取一对
AND - OR 取一个列表
AND
/ \
OR EQ
/ \ / \
EQ EQ A B
/ \ / \
X Y Z W
遍历后的输出应该是:
( A EQUALS B AND ( X EQUALS Y OR Z EQUALS W ) )
理论上我理解我应该将 JSON 作为一棵树并以有序(左-根-右)方法遍历它。
实际上,我实现了接受树的有序方法(标记有根和左右......尽可能深)。但是,我似乎无法正确理解如何将 JSON 作为一棵树来阅读并标记其内容,如果这是正确的想法!
有什么想法吗?
的确,你可以使用中序遍历。使用递归,它可能看起来像这样:
def dfs(node):
key, value = list(node.items())[0]
if isinstance(value, list):
yield "("
yield from dfs(value[0])
yield ")"
yield key
yield "("
yield from dfs(value[1])
yield ")"
else:
a, b = list(value.items())[0]
if isinstance(b, (list, dict)):
yield key
yield "("
yield from dfs(value)
yield ")"
else:
yield a
yield key
yield b
使用示例:
tree = {
"NOT": {
"AND": [{
"OR": [{
"NOT": {
"EQUALS" : {"X":"Y"}
}
}, {
"EQUALS": {"Z":"W"}
}]
}, {
"EQUALS" : {"A": "B"}
}]
}
}
print(" ".join(dfs(tree)))
此示例的输出:
NOT ( ( ( NOT ( X EQUALS Y ) ) OR ( Z EQUALS W ) ) AND ( A EQUALS B ) )
JSON 输入为:
{
"AND":
[
{"OR": [ { "EQUALS" : {"X":"Y"} }, { "EQUALS": {"Z":"W"} } ]},
{"EQUALS" : {"A": "B"} }
]
}
EQUALS 取一对
AND - OR 取一个列表
AND
/ \
OR EQ
/ \ / \
EQ EQ A B
/ \ / \
X Y Z W
遍历后的输出应该是:
( A EQUALS B AND ( X EQUALS Y OR Z EQUALS W ) )
理论上我理解我应该将 JSON 作为一棵树并以有序(左-根-右)方法遍历它。
实际上,我实现了接受树的有序方法(标记有根和左右......尽可能深)。但是,我似乎无法正确理解如何将 JSON 作为一棵树来阅读并标记其内容,如果这是正确的想法!
有什么想法吗?
的确,你可以使用中序遍历。使用递归,它可能看起来像这样:
def dfs(node):
key, value = list(node.items())[0]
if isinstance(value, list):
yield "("
yield from dfs(value[0])
yield ")"
yield key
yield "("
yield from dfs(value[1])
yield ")"
else:
a, b = list(value.items())[0]
if isinstance(b, (list, dict)):
yield key
yield "("
yield from dfs(value)
yield ")"
else:
yield a
yield key
yield b
使用示例:
tree = {
"NOT": {
"AND": [{
"OR": [{
"NOT": {
"EQUALS" : {"X":"Y"}
}
}, {
"EQUALS": {"Z":"W"}
}]
}, {
"EQUALS" : {"A": "B"}
}]
}
}
print(" ".join(dfs(tree)))
此示例的输出:
NOT ( ( ( NOT ( X EQUALS Y ) ) OR ( Z EQUALS W ) ) AND ( A EQUALS B ) )