python - 如何解析表示树状图的字典以创建另一个表示所有父节点和子节点的字典?
问题描述
我正在使用 Allen Brain 的鼠标RNA-seq 数据,并从提供的 dend.json 文件中创建一个字典,其中键是父节点,值是父节点拆分或导致的节点. 您可以在此处查看树状图。
加载 json 文件的字典如下所示:
{'node_attributes': [{'height': 0.8416,
'members': 290,
'edgePar.col': '#000000',
'edgePar.lwd': 2,
'edgePar.conf': 1,
'label': '',
'midpoint': 256.4472,
'cell_set_accession': 'CS1910120323',
'cell_set_alias': '',
'cell_set_designation': 'Neuron/Non-Neuron',
'X': '291',
'node_id': 'n1'}],
'children': [{'node_attributes': [{'height': 0.6271,
'members': 279,
'edgePar.col': '#000000',
'edgePar.lwd': 2,
'edgePar.conf': 1,
'label': '',
'midpoint': 226.7537,
'cell_set_accession': 'CS1910120324',
'cell_set_alias': '',
'cell_set_designation': 'Neuron/Non-Neuron',
'X': '292',
'node_id': 'n2'}],
'children': [{'node_attributes': [{'height': 0.365,
'members': 271,
'edgePar.col': '#000000',
'edgePar.lwd': 2,
'edgePar.conf': 1,
'label': '',
'midpoint': 178.695,
'cell_set_accession': 'CS1910120325',
'cell_set_alias': '',
'cell_set_designation': 'Neuron 001-271',
'X': '293',
'node_id': 'n3'}],............
并dictionary['children'][0]
遵循左拆分,如果一个节点有两个拆分,则dictionary['children'][1]
遵循右拆分。
我希望输出的形式类似于:
{n1 : [n2, n281],
n2 : [n3, n284],...}
目前,我只能解析字典并使用改编自另一篇文章的代码返回节点:
def walk(d):
for k,v in d.items():
if isinstance(v, str) or isinstance(v, int) or isinstance(v, float):
if k == 'node_id':
print('node:', v)
elif isinstance(v, list):
for v_int in range(len(v)):
walk(v[v_int])
walk(dend)
Output:
node: n1
node: n2
node: n3
node: n4
node: n183
node: n184
node: n185
解决方案
这可能接近您想要的。
https://github.com/danielsf/AllenInstTools_by_SFD/blob/master/parse_dendrogram.py
CellNode
它为树状图中的每个节点创建一个类,该类存储节点的名称(the cell_set_accession
),以及所有祖先、子代(直接子代)和最终子代(所有节点的后代)的名称列表。当前节点)在树中。该方法build_tree
将返回一个以 为键的字典cell_set_accession
,其值为CellNode
该节点的 。
如果您不喜欢cell_set_accession
用作节点的名称,可以在脚本的第 120 行更改它。
如果您想在您的 dict 中获得更多或更少的信息,您可以识别叶节点,因为它们将返回空列表node.children
。
代码对于我的目的来说已经足够好了(这是一种很好的说法,我没有严格测试它)。如果某些事情没有按预期工作,请随时与我们联系。
推荐阅读
- python - 为验证文件是否为pdf的函数编写单元测试?
- python - 使用python在mysql Db中插入元组列表
- android - Is their any way to split video into multiple segment using ffmpeg in android?
- python-3.x - 如何配置 ODBC 名称和驱动程序以使其被 pyodbc 识别?
- python - Flask 和 PyJWT 检索授权标头
- javascript - 如何从 adobe 启动或 adobe 分析中的元标记获取值
- bash - Sed with two variable
- unity3d - Creating a border of cubes around screen
- python-3.x - Python | Boto3 - AWS SNS Email formatting issue
- jekyll - 带有 Jekyll 的 GitHub 页面仅显示裸 html