【问题标题】:Need help in Extracting information from an JSON which is storing an Abstract Syntax Tree需要帮助从存储抽象语法树的 JSON 中提取信息
【发布时间】:2017-03-04 23:17:24
【问题描述】:
{
    "id": "9",
    "children": [{
        "id": "8",
        "children": [{
            "id": "7",
            "children": [{
                "id": "6",
                "children": [
                    {
                        "id": "0",
                        "type": "isPathForward"
                    },
                    {
                        "id": "2",
                        "children": [{
                            "id": "1",
                            "type": "maze_moveForward"
                        }],
                        "type": "DO"
                    },
                    {
                        "id": "5",
                        "children": [{
                            "id": "4",
                            "children": [{
                                "id": "3",
                                "type": "turnLeft"
                            }],
                            "type": "maze_turn"
                        }],
                        "type": "ELSE"
                    }
                ],
                "type": "maze_ifElse"
            }],
            "type": "DO"
        }],
        "type": "maze_forever"
    }],
    "type": "program"
}

上述有效的 JSON 基本上是一个 AST(抽象语法树),我只想按以下顺序提取“类型”:1) 节点后跟 2) 左子节点,然后 3) 右子节点

与上面的 JSON 完全一样:

Program
maze_forever
DO
maze_ifElse
isPathforward
Do
maze_moveForward
Else
maze_turn
turn_Left

我没有使用过 json 我尝试在 python 中使用生成器,但是在转换为 dict 的过程中顺序丢失了。
你能为此写一个python实现吗?

更新!!!!

到目前为止我已经尝试过:

导入 json json_string= json.loads(高于 json)

when i type :
for i in json_string:
...     print(i)
...


OUTPUT


type
id
children

我也试过了

import pandas as pd
 d=pd.read_json('{    "id": "9",    "children": [{        "id": "8",        "children": [{            "id": "7",            "children": [{                "id": "6",                "children": [                    {                        "id": "0",                        "type": "isPathForward"                    },                    {                        "id": "2",                        "children": [{                            "id": "1",                            "type": "maze_moveForward"                        }],                        "type": "DO"                    },                    {                        "id": "5",                        "children": [{                            "id": "4",                            "children": [{                                "id": "3",                                "type": "turnLeft"                            }],                            "type": "maze_turn"                        }],                        "type": "ELSE"                    }                ],                "type": "maze_ifElse"            }],            "type": "DO"        }],        "type": "maze_forever"    }],    "type": "program"}')


>>> d
output :
                                           children  id     type
0  {'type': 'maze_forever', 'id': '8', 'children'...   9  program

以上两种情况:

我不知道如何递归地进入孩子,因为每个孩子都有一个或多个孩子。我搜索的大多数答案都没有解释与上面的 JSON 一样嵌套的 JSON。

【问题讨论】:

  • 订单没有丢失,它从未出现过。 JSON 对象不保证有序;如果您关心顺序,请在迭代时使用数组或按适当的键排序。
  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • 上面的 json 代表一个抽象语法树,如果有办法按照我上面提到的方式提取信息会非常有帮助..谢谢!
  • 好的,稍后会发布截图。
  • 请不要发布截图。代码是文本,在问题中这样写。回溯等也是如此;搜索无法索引图像的内容。

标签: python json recursion abstract-syntax-tree tree-traversal


【解决方案1】:

最明显的实现是递归函数:

>>> def process(data):
...     if 'type' in data: print data['type']
...     if 'children' in data:
...         for child in data['children']:
...             process(child)
...
>>> j = json.load(open('test.json', 'r'))
>>> process(j)
program
maze_forever
DO
maze_ifElse
isPathForward
DO
maze_moveForward
ELSE
maze_turn
turnLeft

请注意,我们正在打印当前结构的类型之前我们递归到孩子。

【讨论】:

  • 我是 python 新手,而且在过去的 6 个月里,我每天只用 Java 编写两次代码。这实际上是我的第一个数据科学项目,而不是我的家庭作业。你优雅的解决方案非常有帮助,老实说,我对我的递归技能感到尴尬。没有使用任何花哨的包,订单正在完美恢复&这就是我想要的&我正在考虑预购、DFS等,但我知道递归是它,但我的python语法很差你第二行代码中的if条件让我认识到 !!!今天学到了一些东西非常感谢!
猜你喜欢
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2017-07-26
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2022-08-02
相关资源
最近更新 更多