Python 树存储来自 json 输入文件的表达式
Python tree storing expressions from json input file
我有一个输入 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()
只打印出例如"let x0 be 1" 正确,但甚至不记得它们。任何帮助将不胜感激
这是一个开始。它使用递归来分解 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])]))
这是一个课程作业问题,我正在报告这个问题。
我有一个输入 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()
只打印出例如"let x0 be 1" 正确,但甚至不记得它们。任何帮助将不胜感激
这是一个开始。它使用递归来分解 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])]))
这是一个课程作业问题,我正在报告这个问题。