我的代码首先读取包含带属性的节点和弧的图形,然后计算节点attributes('criticité')
。之后,它会在条件下删除节点。
这是我的代码,我收到的类型错误是TypeError: unhashable type: 'dict'
#parsing
import matplotlib.pyplot as plt
import networkx as nx
G=nx.read_graphml("C:/Users/PlacisAdmin/Desktop/gephi/ex2.graphml",node_type=str)
nx.draw(G, with_labels=True)
plt.show()
# chnage nodes attributes
for u, v, weight in G.edges.data('weight'):
if weight !=1:
G.node[u]['criticité'] = float(G.node[u]['occurence']) * float (G.node[u]['détection']) * float (G.node[u]['gravité']) * weight
G.node[v]['criticité'] = float(G.node[v]['occurence']) * float (G.node[v]['détection']) * float (G.node[v]['gravité']) * weight
print ("avant")
print (G.nodes.data('label'))
print (G.nodes.data('criticité'))
# calculate system crticité
for n in G.nodes():
if G.node[n]['label']in ['1','2','3','4']:
G.node[n]['criticité']=sum(G.node[t]['criticité'] for t in G.successors(n))
print ("après")
print (G.nodes.data('label'))
print (G.nodes.data('criticité'))
# eliminate nodes
for d in G.nodes():
if G.node[d]['label']in ['1','2','3','4'] and G.node[d]['criticité']> 30:
G.remove_nodes_from(G.node[t]for t in G.successors(d) )
# show the graph
nx.draw(G, with_labels=True)
plt.show()
答案 0 :(得分:1)
我相信你的错误就在这一行:
G.remove_nodes_from(G.node[t]for t in G.successors(d) )
G.node[t]
是一个包含节点t
的所有属性的字典。因此,它正在寻找 节点t
属性的字典的节点。但是,networkx不允许节点成为决策。因此,当它开始寻找要删除的节点时,它会给你一条错误消息。
你几乎肯定要打电话
G.remove_nodes_from(t for t in G.successors(d))
答案 1 :(得分:-2)
这个可能重复:https://stackoverflow.com/a/19371472/8933502
dict
是可变的,因此无法进行哈希处理。您可以创建自己的哈希dict并将其哈希在id(d)
上(例如,不可变的东西)。