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的节点。
发布于 2019-03-20 03:43:07
我认为你把节点和节点标签搞错了。在图中有重复的节点是没有意义的。我觉得你在这里需要的是重复的标签。
要将标签的概念添加到图中,您可以拥有一个将节点标识符(唯一)映射到节点标签(可能不是唯一的)的字典:
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'}
https://stackoverflow.com/questions/55248283
复制相似问题