如何解析表示树状图的字典以创建另一个表示所有父节点和子节点的字典?
How to parse a dictionary representing a dendrogram to create another dictionary representing all parent and child nodes?
我正在使用 Allen Brain 的鼠标 RNA-seq data, and from the dend.json file provided I want to create a dictionary where the key is a parent node, and the value would be the nodes the parent node splits into or leads to. You can see the dendrogram 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],...}
目前,我只能使用改编自另一个 post:
的代码来解析字典和 return 节点
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
它创建一个 class CellNode
存储树状图中每个节点的名称(cell_set_accession
),以及名称列表树中的所有祖先,children(直接 children)和最终 children(所有 节点从当前节点下降)。方法 build_tree
将 return 以 cell_set_accession
为关键字的字典,其值为该节点的 CellNode
。
如果您不喜欢使用 cell_set_accession
作为节点的名称,您可以在脚本的第 120 行更改它。
如果您想在字典中获得更多或更少的信息,您可以识别叶节点,因为它们将 return 为 node.children
的空列表。
该代码足以满足我的目的(这是一种很好的说法,我没有严格测试它)。如果某些地方没有按预期工作,请随时与我们联系。
我正在使用 Allen Brain 的鼠标 RNA-seq data, and from the dend.json file provided I want to create a dictionary where the key is a parent node, and the value would be the nodes the parent node splits into or leads to. You can see the dendrogram 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],...}
目前,我只能使用改编自另一个 post:
的代码来解析字典和 return 节点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
它创建一个 class CellNode
存储树状图中每个节点的名称(cell_set_accession
),以及名称列表树中的所有祖先,children(直接 children)和最终 children(所有 节点从当前节点下降)。方法 build_tree
将 return 以 cell_set_accession
为关键字的字典,其值为该节点的 CellNode
。
如果您不喜欢使用 cell_set_accession
作为节点的名称,您可以在脚本的第 120 行更改它。
如果您想在字典中获得更多或更少的信息,您可以识别叶节点,因为它们将 return 为 node.children
的空列表。
该代码足以满足我的目的(这是一种很好的说法,我没有严格测试它)。如果某些地方没有按预期工作,请随时与我们联系。