如何解析一个表示树状图的字典来创建另一个表示所有父节点和子节点的字典?

2024-10-01 17:42:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Allen Brain的鼠标RNA-seq data,从提供的dend.json文件中,我想创建一个字典,其中键是父节点,值是父节点拆分成的节点或指向的节点。你可以看到树状图here

加载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

Tags: idnode字典节点cellcolattributesisinstance
1条回答
网友
1楼 · 发布于 2024-10-01 17:42:17

这可能接近你想要的

https://github.com/danielsf/AllenInstTools_by_SFD/blob/master/parse_dendrogram.py

它创建一个类CellNode,为树状图中的每个节点存储节点的名称(节点的cell_set_accession),以及树中所有祖先、子节点(直系子节点)和最终子节点(从当前节点派生的所有节点)的名称列表。方法build_tree将返回在cell_set_accession上键入的dict,其值为该节点的CellNode

如果不喜欢使用cell_set_accession作为节点的名称,可以在脚本的第120行进行更改

如果您想在dict中获得更多或更少的信息,您可以识别叶节点,因为它们将为node.children返回空列表

代码对于我的目的来说已经足够好了(这是一个很好的说法,说明我没有严格测试它)。如果有什么事情没有如预期的那样起作用,请随时联系

相关问题 更多 >

    热门问题