首页 > 解决方案 > 如何解析表示树状图的字典以创建另一个表示所有父节点和子节点的字典?

问题描述

我正在使用 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

标签: pythondictionarydendrogramallen-sdk

解决方案


这可能接近您想要的。

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

代码对于我的目的来说已经足够好了(这是一种很好的说法,我没有严格测试它)。如果某些事情没有按预期工作,请随时与我们联系。


推荐阅读