我对C++相当精通,但我同时也在学习python、NetworkX和有关pythonic代码的知识。在阅读了各种网站和参考资料后,我的问题与this question相同。不同的是,我正在采取的方法来执行我的任务。请注意,这个问题是关于添加一个边缘,而不是drawing。我有一个图(SAR),它的节点也是图(船和漂流图),
import networkx as nx
import math
# User Inputs
Num_Adrift = 4
# Cluster Definition
Boat = nx.Graph(P_Weight=7000,P_Vol=9*29*60,P_MPG=1,P_Speed=20,P_Crew_Lim=5,P_Asset=1,P_Count=1)
Adrift = nx.Graph(P_Distance=2,P_Time_Lim=30,P_DriftSpeed=1,P_Asset=0,P_Count=Num_Adrift)
SAR = nx.Graph(P_Success = 0)
# SAR Graph
SAR.add_node(Boat)
SAR.add_node(Adrift)这就是对上述问题的评论中所采用的方法。我可以把船和漂流连接起来,
SAR.add_edge(Boat,Adrift,weight=1)假设Boat有一个节点:
Boat.add_node("embark",P_Material=1,C_supply=1)漂流有节点,
Adrift.add_node("embark",P_lock=1,P_Material=1,C_supply=0)它们具有相同的名称(目的是使节点连接和以后的计算自动化)。
问题1:为什么这个语法不能工作,以及如何修复它?是否因为它们本身不是SAR内的节点?
SAR.add_edge(Boat.node["embark"],Adrift.node["embark"],weight=1)问题2:是否能够区分Boat.node“登船”和Adrift.node“登船”,还是认为我是在尝试从一个节点到它自己?
我得到的错误是:
---> 76 SAR.add_edge(Boat.node["embark"],Adrift.node["embark"],weight=1) #<--- this part of code = problem :(
/anaconda3/lib/python3.6/site-packages/networkx/classes/graph.py in add_edge(self, u_of_edge, v_of_edge, **attr)
873 u, v = u_of_edge, v_of_edge
874 # add nodes
--> 875 if u not in self._node:
876 self._adj[u] = self.adjlist_inner_dict_factory()
877 self._node[u] = {}
TypeError: unhashable type: 'dict'发布于 2018-08-17 15:04:14
TypeError:难以理解的类型:“dict”
NetworkX使用python作为数据结构。因此,当您添加一个节点时,节点就是dict中给定值的key,例如,它的边缘列表。
对象要成为键,就必须是唯一的。要比较键之间的唯一性,对象必须是可选的。
由于字典是不可理解的,所以不能使用字典作为键,因此不能使用字典作为节点。
你所能做的就是将整数映射到你的字典中,并将它存储在另一本字典中。然后,可以将整数作为节点,并从另一个dict获取实际值。
https://stackoverflow.com/questions/51897238
复制相似问题