Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组关联Python_Python_Arrays_Dictionary_Tree - Fatal编程技术网

数组关联Python

数组关联Python,python,arrays,dictionary,tree,Python,Arrays,Dictionary,Tree,我有一个模拟树形图的CSV文件,如下所示: A,B #A is associated to B A,C #A is associated to C B,D #B is associated to D B,E #B is associated to E C,F #C is associated to F C,G #C is associated to G A是根(树的顶部)B&C是树枝,D、E、F、G是叶子(树枝的子部分) 我想知道是否有一种方法可以将其放入一个与其关联的数组中?用于制

我有一个模拟树形图的CSV文件,如下所示:

A,B #A is associated to B

A,C #A is associated to C

B,D #B is associated to D

B,E #B is associated to E

C,F #C is associated to F

C,G #C is associated to G
A是根(树的顶部)B&C是树枝,D、E、F、G是叶子(树枝的子部分)

我想知道是否有一种方法可以将其放入一个与其关联的数组中?

用于制作有向图和绘制有向图的图像:

import networkx as nx
import matplotlib.pyplot as plt

text =\
"""A,B
A,C
B,D
B,E
C,F
C,G"""

graph = nx.DiGraph()
for i in text.split('\n'):
    graph.add_edge(i[0], i[2])

nx.draw(graph, with_labels=True)
plt.show()
注意这一行:
图形。添加边(i[0],i[2])
如果此图中不存在该节点,将自动创建该节点

绘图:

用于制作有向图和绘制有向图的图像:

import networkx as nx
import matplotlib.pyplot as plt

text =\
"""A,B
A,C
B,D
B,E
C,F
C,G"""

graph = nx.DiGraph()
for i in text.split('\n'):
    graph.add_edge(i[0], i[2])

nx.draw(graph, with_labels=True)
plt.show()
注意这一行:
图形。添加边(i[0],i[2])
如果此图中不存在该节点,将自动创建该节点

绘图:

保存信息的自然结构是一个字典,其中每个条目的键是一个节点名(例如,C),该节点名出现在csv文件的一行左侧,该dict条目的值是一个数组,该数组最终包含作为该键的直接子节点的所有节点的名称(例如,[F,G])

因此,在处理csv文件的每一行(例如B,D)时,请检查第一个元素(例如B)是否已经是dict中的键。如果不是,请在dict中添加一个key=B、value=[D]的条目。如果已经存在,则将第二个元素附加到该键的数组值。例如,当您到达数据行B,E时,您将找到B的条目(B=>[D]),并将E附加到其值上,得到[D,E]


完成后,如果某个节点的名称从未出现在任何条目的数组值中,则该节点就是树的根。如果有多个节点具有此属性,则这些节点中的每一个都是树林中树的根。

保存信息的自然结构是一个字典,其中每个条目的键是一个节点名(例如,C)它出现在csv文件中一行的左侧,该dict条目的值是一个数组,最终包含作为该键的直接子项的所有节点的名称(例如,[F,G])

因此,在处理csv文件的每一行(例如B,D)时,请检查第一个元素(例如B)是否已经是dict中的键。如果不是,请在dict中添加一个key=B、value=[D]的条目。如果已经存在,则将第二个元素附加到该键的数组值。例如,当您到达数据行B,E时,您将找到B的条目(B=>[D]),并将E附加到其值上,得到[D,E]


完成后,如果某个节点的名称从未出现在任何条目的数组值中,则该节点就是树的根。如果有多个节点具有此属性,则这些节点中的每一个都是树林中树的根。

假设文件
my.csv
包含您给出的示例输入,此代码将图形结构记录在两个简单的Python
dict
对象中:

parent = {}
children = {}
with open( 'my.csv', 'rt' ) as fh:
    for line in fh:
        # strip the comments and line endings
        if '#' in line: line = line[ :line.index( '#' ) ]
        line = line.strip()
        if line:
            # record the association
            node, subnode = line.split( ',', 1 )
            parent[ subnode ] = node
            children.setdefault( node, [] ).append( subnode )
然后,语法
children['A']
允许您查找属于节点
'A'
的子节点列表,而语法
parent['B']
允许您以另一种方式查找节点
'B'
的父节点。或者,您可以使用以下工具将整个内容打印出来:

for node, subnodes in sorted( children.items() ):
    print( '%r : %r' % ( node, subnodes ) )
输出:

'A' : ['B', 'C']
'B' : ['D', 'E']
'C' : ['F', 'G']

假设文件
my.csv
包含您给出的示例输入,此代码将图形结构记录在两个简单的Python
dict
对象中:

parent = {}
children = {}
with open( 'my.csv', 'rt' ) as fh:
    for line in fh:
        # strip the comments and line endings
        if '#' in line: line = line[ :line.index( '#' ) ]
        line = line.strip()
        if line:
            # record the association
            node, subnode = line.split( ',', 1 )
            parent[ subnode ] = node
            children.setdefault( node, [] ).append( subnode )
然后,语法
children['A']
允许您查找属于节点
'A'
的子节点列表,而语法
parent['B']
允许您以另一种方式查找节点
'B'
的父节点。或者,您可以使用以下工具将整个内容打印出来:

for node, subnodes in sorted( children.items() ):
    print( '%r : %r' % ( node, subnodes ) )
输出:

'A' : ['B', 'C']
'B' : ['D', 'E']
'C' : ['F', 'G']

可以发布预期的输出吗?可以发布预期的输出吗?对于节点,subnode=line.split(','),我得到的值太多,无法解包错误,这必须归因于输入文件中的不规则性。它使用您的示例输入为我运行,如果输入与该示例中表示的完全相同(即每行正好有2个逗号分隔的项目,没有尾随逗号),则不会出现该错误。我在
split()
中添加了一个
maxslit=1
参数,当一行中恰好有两个以上逗号分隔的项目时,该参数应该可以消除错误:生成的子节点“name”将是错误的,但至少您可以检查它,看看问题是什么,问题出在哪里。我得到了太多的值,无法为node解包错误,subnode=line.split(“,”),这必须归因于输入文件中的不规则性。它使用您的示例输入为我运行,如果输入与该示例中表示的完全相同(即每行正好有2个逗号分隔的项目,没有尾随逗号),则不会出现该错误。我在
split()
中添加了一个
maxslit=1
参数,当一行中恰好有两个以上逗号分隔的项目时,该参数应该可以消除错误:生成的子节点“name”将是错误的,但至少您可以检查它以了解问题所在。