【问题标题】:Python tree storing expressions from json input filePython 树存储来自 json 输入文件的表达式
【发布时间】:2016-02-04 22:52:47
【问题描述】:

我有一个输入 json 文件,并尝试使用 python 将变量及其值存储在树中,然后将结果输出到文件中。 json 文件包含整数、表达式元组和集合。

我的 json 文件的一部分:

{
    "declaration-list" : [
    {
            "declared-variable" : "x0",
            "value" : 1
          },
    {
            "declared-variable" : "x1",
            "value" : 2
          },
    {
            "declared-variable" : "x2",
            "value" : {
                "operator" : "set",
                "arguments" : [
                    {
                        "variable" : "x0"
                      },
                    {
                        "variable" : "x1"
                      }
                  ]
              }
          },
    {
            "declared-variable" : "x3",
            "value" : {
                "operator" : "set",
                "arguments" : [
                    {
                        "operator" : "tuple",
                        "arguments" : [
                            1,
                            2
                          ]
                      },
                    {
                        "operator" : "tuple",
                        "arguments" : [
                            3,
                            4
                          ]
                      }
                  ]
              }
          },

 ]
}

该输入的输出应该是:

let x0 be 1;
let x1 be 2;
let x2 be {1, 2};
let x3 be {(1, 2), (3, 4)};

到目前为止,我只有这个,我不知道从哪里或如何开始将它们全部存储在树等中。

import json
from pprint import pprint

with open('input.json') as data_file:    
    data = json.load(data_file)

for x in data["declaration-list"]:
    print "let %s be %s" % ((x["declared-variable"]), (x["value"]))

data_file.close()

仅打印出来,例如“让 x0 为 1” 正确,但甚至不记得它们。任何帮助将不胜感激

【问题讨论】:

    标签: python json tree


    【解决方案1】:

    这是一个课程作业问题,我正在报告。

    【讨论】:

      【解决方案2】:

      这是一个开始。它使用递归来分解 JSON 并构建数据结构。数据结构本质上是 JSON 结构的某种抽象的 Python 实现。您应该能够应用相同的递归方法来生成您需要的任何风格的输出文本。

      json_data = {
          "declaration-list" : [
              { "declared-variable": "x0", "value": 1 },
              { "declared-variable": "x1", "value": 2 },
              { "declared-variable": "x2",
                "value" : {
                    "operator": "set",
                    "arguments": [
                        { "variable": "x0" },
                        { "variable": "x1" }
                    ]
                }
              },
              { "declared-variable" : "x3",
                "value" : {
                    "operator" : "set",
                    "arguments" : [
                        {
                            "operator": "tuple",
                            "arguments": [ 1, 2 ]
                        },
                        {
                            "operator": "tuple",
                            "arguments": [ 3, 4 ]
                        }
                    ]
                }
              },
          ]
      }
      
      def parse_declaration(declinfo):
          vname = declinfo['declared-variable']
          rvalue = parse_rvalue(declinfo['value'])
          return ('let', vname, rvalue)
      
      def _rv_parse_set(valinfo):
          assert valinfo['operator'] == 'set'
          args = [parse_rvalue(a) for a in valinfo['arguments']]
          return ('set', args)
      
      def _rv_parse_tuple(valinfo):
          assert valinfo['operator'] == 'tuple'
          args = valinfo['arguments']
          return ('tuple', args)
      
      _rv_parser = {
          "set": _rv_parse_set,
          "tuple":_rv_parse_tuple,
      }
      
      def parse_rvalue(valinfo):
          try:
              if 'operator' in valinfo:
                  op = valinfo['operator']
                  return _rv_parser[op](valinfo)
              elif 'variable' in valinfo:
                  return ('variable', valinfo['variable'])
      
          except TypeError:
              return ('value', valinfo)
      
      def parse_json(json_data):
          declaration_list = json_data['declaration-list']
      
          for i in declaration_list:
              print(parse_declaration(i))
      
      if __name__ == "__main__":
          parse_json(json_data)
      

      输出是:

      ('let', 'x0', ('value', 1))
      ('let', 'x1', ('value', 2))
      ('let', 'x2', ('set', [('variable', 'x0'), ('variable', 'x1')]))
      ('let', 'x3', ('set', [('tuple', [1, 2]), ('tuple', [3, 4])]))
      

      【讨论】:

      • 非常感谢,这将是一个很好的开始
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 2021-05-25
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多