python - JSON转树图
问题描述
我有一个严重嵌套的 JSON 对象。有没有一种方法可以查看分层树形图?我浏览了几个资源,如 Pydot、Plotly 等,但没有什么能以我的格式呈现 JSON。
JSON文件:
{
"found_intents": {
"_DATE": {}
},
"sentence": "What is your name",
"tree": [
[
{
"canonical": null,
"concept": "_START_TAG",
"correct_string": "<start>",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "<start>",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "<start>",
"language": "english",
"span": [
0,
1
],
"span_string": "<start>",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "<start>",
"language": "english",
"span": [
0,
1
],
"span_string": "<start>",
"weight": 1.0
},
{
"canonical": null,
"concept": "_WHAT_IS",
"correct_string": "what is",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "what",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "what",
"language": "english",
"span": [
1,
2
],
"span_string": "what",
"weight": 1.0
},
{
"canonical": null,
"concept": "",
"correct_string": "is",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "is",
"language": "english",
"span": [
2,
3
],
"span_string": "is",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "what is",
"language": "english",
"span": [
1,
3
],
"span_string": "what is",
"weight": 1.0
},
{
"canonical": null,
"concept": "_DICTIONARY",
"correct_string": "your",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "your",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "your",
"language": "english",
"span": [
3,
4
],
"span_string": "your",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "your",
"language": "english",
"span": [
3,
4
],
"span_string": "your",
"weight": 1.0
},
{
"canonical": null,
"concept": "_DICTIONARY",
"correct_string": "name",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "name",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "name",
"language": "english",
"span": [
4,
5
],
"span_string": "name",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "name",
"language": "english",
"span": [
4,
5
],
"span_string": "name",
"weight": 1.0
},
{
"canonical": null,
"concept": "_END_TAG",
"correct_string": "<end>",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "<end>",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "<end>",
"language": "english",
"span": [
5,
6
],
"span_string": "<end>",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "<end>",
"language": "english",
"span": [
5,
6
],
"span_string": "<end>",
"weight": 1.0
}
],
[
{
"canonical": null,
"concept": "_START_TAG",
"correct_string": "<start>",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "<start>",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "<start>",
"language": "english",
"span": [
0,
1
],
"span_string": "<start>",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "<start>",
"language": "english",
"span": [
0,
1
],
"span_string": "<start>",
"weight": 1.0
},
{
"canonical": null,
"concept": "_WHAT_IS",
"correct_string": "what is",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "what",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "what",
"language": "english",
"span": [
1,
2
],
"span_string": "what",
"weight": 1.0
},
{
"canonical": null,
"concept": "",
"correct_string": "is",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "is",
"language": "english",
"span": [
2,
3
],
"span_string": "is",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "what is",
"language": "english",
"span": [
1,
3
],
"span_string": "what is",
"weight": 1.0
},
{
"canonical": null,
"concept": "_DICTIONARY",
"correct_string": "your",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "your",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "your",
"language": "english",
"span": [
3,
4
],
"span_string": "your",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "your",
"language": "english",
"span": [
3,
4
],
"span_string": "your",
"weight": 1.0
},
{
"canonical": null,
"concept": "_THEATRE_ID",
"correct_string": "name",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "name",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "name",
"language": "english",
"span": [
4,
5
],
"span_string": "name",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "name",
"language": "english",
"span": [
4,
5
],
"span_string": "name",
"weight": 1.0
},
{
"canonical": null,
"concept": "_END_TAG",
"correct_string": "<end>",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "<end>",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "<end>",
"language": "english",
"span": [
5,
6
],
"span_string": "<end>",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "<end>",
"language": "english",
"span": [
5,
6
],
"span_string": "<end>",
"weight": 1.0
}
],
[
{
"canonical": null,
"concept": "_START_TAG",
"correct_string": "<start>",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "<start>",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "<start>",
"language": "english",
"span": [
0,
1
],
"span_string": "<start>",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "<start>",
"language": "english",
"span": [
0,
1
],
"span_string": "<start>",
"weight": 1.0
},
{
"canonical": null,
"concept": "_WHAT_IS",
"correct_string": "what is",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "what",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "what",
"language": "english",
"span": [
1,
2
],
"span_string": "what",
"weight": 1.0
},
{
"canonical": null,
"concept": "",
"correct_string": "is",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "is",
"language": "english",
"span": [
2,
3
],
"span_string": "is",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "what is",
"language": "english",
"span": [
1,
3
],
"span_string": "what is",
"weight": 1.0
},
{
"canonical": null,
"concept": "_THEATRE_ID",
"correct_string": "your",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "your",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "your",
"language": "english",
"span": [
3,
4
],
"span_string": "your",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "your",
"language": "english",
"span": [
3,
4
],
"span_string": "your",
"weight": 1.0
},
{
"canonical": null,
"concept": "_DICTIONARY",
"correct_string": "name",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "name",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "name",
"language": "english",
"span": [
4,
5
],
"span_string": "name",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "name",
"language": "english",
"span": [
4,
5
],
"span_string": "name",
"weight": 1.0
},
{
"canonical": null,
"concept": "_END_TAG",
"correct_string": "<end>",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "<end>",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "<end>",
"language": "english",
"span": [
5,
6
],
"span_string": "<end>",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "<end>",
"language": "english",
"span": [
5,
6
],
"span_string": "<end>",
"weight": 1.0
}
],
[
{
"canonical": null,
"concept": "_START_TAG",
"correct_string": "<start>",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "<start>",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "<start>",
"language": "english",
"span": [
0,
1
],
"span_string": "<start>",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "<start>",
"language": "english",
"span": [
0,
1
],
"span_string": "<start>",
"weight": 1.0
},
{
"canonical": null,
"concept": "_WHAT_IS",
"correct_string": "what is",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "what",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "what",
"language": "english",
"span": [
1,
2
],
"span_string": "what",
"weight": 1.0
},
{
"canonical": null,
"concept": "",
"correct_string": "is",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "is",
"language": "english",
"span": [
2,
3
],
"span_string": "is",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "what is",
"language": "english",
"span": [
1,
3
],
"span_string": "what is",
"weight": 1.0
},
{
"canonical": null,
"concept": "_THEATRE_ID",
"correct_string": "your",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "your",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "your",
"language": "english",
"span": [
3,
4
],
"span_string": "your",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "your",
"language": "english",
"span": [
3,
4
],
"span_string": "your",
"weight": 1.0
},
{
"canonical": null,
"concept": "_THEATRE_ID",
"correct_string": "name",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "name",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "name",
"language": "english",
"span": [
4,
5
],
"span_string": "name",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "name",
"language": "english",
"span": [
4,
5
],
"span_string": "name",
"weight": 1.0
},
{
"canonical": null,
"concept": "_END_TAG",
"correct_string": "<end>",
"definition": "",
"details": [
{
"canonical": null,
"concept": "",
"correct_string": "<end>",
"definition": "",
"details": [],
"e.g.": [],
"grammar": "<end>",
"language": "english",
"span": [
5,
6
],
"span_string": "<end>",
"weight": 1.0
}
],
"e.g.": [],
"grammar": "<end>",
"language": "english",
"span": [
5,
6
],
"span_string": "<end>",
"weight": 1.0
}
]
]
}
更准确地说,我想提取每个级别的平均分支数。
预期结果将是:
Level 0: 4
Level 1: (1 + 2 + 1 + 1)/4
Level 2: 0
解决方案
目前尚不完全清楚您要做什么,但以下代码计算了每个嵌套深度的字典和列表的数量。我们使用collections.deque
堆栈来执行广度优先搜索,计算每个级别的嵌套容器的数量,将计数存储在defaultdict
列表中,并将这些容器推入堆栈以供将来处理。当我们计算完所有对象后,我们计算每个级别的平均分支数。
我不会将您的数据粘贴到此代码中,因为它大约有 740 行长。我将该数据称为data_string
,在我的机器上,我只是将您的数据用三引号括起来,但当然您可以将其保存为文件,并用于json.load
加载它。
import json
from collections import defaultdict, deque
data = json.loads(data_string)
def get_branches(obj):
branches = defaultdict(list)
stack = deque()
stack.append((obj, 0))
while stack:
obj, depth = stack.pop()
newdepth = depth + 1
branch_count = 0
if isinstance(obj, dict):
obj = obj.values()
for child in obj:
if isinstance(child, (list, dict)):
branch_count += 1
stack.append((child, newdepth))
if branch_count:
branches[depth].append(branch_count)
return branches
branches = get_branches(data)
for depth in sorted(branches.keys()):
row = branches[depth]
mean = sum(row) / len(row) if row else None
print('Level', depth, row, mean)
输出
Level 0 [2] 2.0
Level 1 [4, 1] 2.5
Level 2 [5, 5, 5, 5] 5.0
Level 3 [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] 3.0
Level 4 [1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1] 1.2
Level 5 [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] 3.0
推荐阅读
- c++ - Quectel EC25 发送短信并收到+CMS ERROR 305
- php - 为什么这个未定义的数组键错误发生在我的工作室可视代码中?有人能帮我吗?
- c# - 等待在异步方法中调用回调
- node.js - Nest.js/mongoose 和 TypeScript - Prop 装饰器中的错误
- python - spaCy v3 基于现有模型训练 NER 或将自定义训练的 NER 添加到现有模型
- java - 将小数从一个基数转换为另一个基数
- postgresql - postgresql UPDATE 和 RETURNING 查询不返回最新值
- c++ - 转储 std::unique_ptr
归档内容 - php - 数组中的元素不适用于 in_array
- c# - 如何使用 c# 在 Unity 中移动到下一个级别/场景