【问题标题】:Array Associations Python数组关联 Python
【发布时间】:2016-01-12 20:29:10
【问题描述】:

我有一个模仿树形图的 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 是叶子(分支的子节点)

我想知道有没有办法把它和它的关联放在一个数组中?

【问题讨论】:

  • 你能发布你的预期输出吗?

标签: python arrays dictionary tree


【解决方案1】:

假设文件 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']

【讨论】:

  • I get a too many values to unpack error for node,subnode=line.split(',')
  • 这一定是由于输入文件中的违规行为。它使用您的示例输入为我运行,如果输入 is 与该示例中表示的完全相同(即每行恰好 2 个逗号分隔的项目,没有尾随逗号),那么您将不会收到该错误.我在split() 中添加了一个maxsplit=1 参数,如果一行中碰巧有2 个以上以逗号分隔的项目,它应该可以消除错误:生成的子节点“名称”将是错误的,但至少你可以检查它,看看问题出在哪里。
【解决方案2】:

使用networkx 制作有向图并使用matplotlib 绘制有向图的图像:

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()

注意这一行:graph.add_edge(i[0], i[2]) 如果此图中不存在该节点,则会自动创建该节点。

剧情:

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2011-07-19
      • 2018-11-29
      • 1970-01-01
      • 2014-04-27
      • 2013-06-09
      相关资源
      最近更新 更多