【问题标题】:NetworkX - allow duplicate nodesNetworkX - 允许重复节点
【发布时间】:2019-03-19 18:59:48
【问题描述】:
import networkx as nx
import matplotlib.pyplot as plt


G = nx.DiGraph()


def calculate_lists(user_input):
    """ Calculates the number of occurences of certain character in a string."""
    input_list = []
    for i in user_input:
        input_list.append(i)

    occurence_list = []
    for i in set(input_list):
        occurence_list.append((i, user_input.count(i)))

    sorted_by_first = sorted(occurence_list, key=lambda tup: tup[1])
    sorted_list = list(reversed(sorted_by_first))

    propability_list = []
    for i in range(len(sorted_list)):
        propability_list.append(sorted_list[i][1])

    print("Input list is: ", input_list)
    print("Input list is: ", input_list)
    print("Occurence list: ", occurence_list)
    print("Sorted list is: ", sorted_list)
    print("Probility list is: ", propability_list)
    return huffmann_algorithm(propability_list)


def huffmann_algorithm(prob_list):
    node_list = []
    while len(prob_list) != 1:
        first_minimum = min(float(s) for s in prob_list)
        print("First minimum", first_minimum)
        prob_list.remove(first_minimum)
        second_minimum = min(float(s) for s in prob_list)
        print("Second minimum", second_minimum)
        prob_list.remove(second_minimum)
        node_list.append([first_minimum, second_minimum])
        print("new value: ", first_minimum+second_minimum)
        new_value = int(first_minimum+second_minimum)
        prob_list.append(new_value)
    print("Finished: ", prob_list)
    count = 0
    for i in node_list:
        print(count)
        print("Nodes: ", tuple(i))
        G.add_node(i[0])
        G.add_node(i[1])
        G.add_node(i[0]+i[1])
        G.add_edge(i[0], i[0]+i[1])
        G.add_edge(i[1], i[0]+i[1])
    print("Node list: ", node_list)
    print(G.nodes())
    nx.draw_networkx(G, with_labels=True, arrows=False)
    plt.savefig("graph1.png")
    plt.show()


def main():
    user_input = str(input("Please enter a text: "))
    calculate_lists(user_input)


if __name__ == "__main__":
    main()

我正在尝试在 python 中实现霍夫曼代码的一个版本。但是,我无法向图中添加重复节点。是否有解决方法来显示具有相同文本的值?要了解我的意思,请输入例如:aaaaabbbbcccdde 该图仅显示一个带有标签 3 的节点。

【问题讨论】:

    标签: python-3.x networkx


    【解决方案1】:

    我认为您将节点误认为带有节点标签。在图中有重复的节点并没有真正的意义。我觉得你需要的是有重复的标签。

    您可以将标签概念添加到图表中的方法是拥有一个将节点标识符(唯一)映射到节点标签(可能不是唯一的)的字典:

    user_input = "aaaaabbbbcccdde"
    labels = {i: l for i, l in enumerate(user_input)}
    nodes = labels.keys()
    

    使用这些你可以构建你的图表:

    G = nx.DiGraph()
    G.add_nodes_from(nodes)
    

    然后你可以,例如,绘制它:

    pos = nx.spring_layout(G)
    nx.draw(G, pos)
    nx.draw_networkx_labels(G, pos, labels)
    

    当然(可能是最重要的),只要你有一个节点标识符,比如node_id,你就可以使用labels[node_id] 检索它的标签。我建议始终使用节点标识符,然后在最后,当您需要打印结果时,您可以将节点标识符转换为人类可读的东西,即。节点标签。

    根据代码的复杂性,您可能还会发现将标签附加到节点对象本身很有用,networkx 允许:

    nx.set_node_attributes(G, labels, 'label')
    

    然后您将可以访问节点属性:

    for u in G.nodes(data=True):
        print(u)
        break
    # Or if you have a node_identifier:
    node_id = 1
    print(G.node[node_id])
    

    这将输出:

    (0, {'label': 'a'})
    {'label': 'a'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-10
      • 2019-08-05
      • 2019-10-11
      • 2016-02-12
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多