我想创建一个数据结构,可以存储顶点的名称,它与边缘权重相邻的顶点。我想过创建一个dict
,它将顶点映射到list
,dict
还有D = {
vertex1: [
{
Adj_vertex1: edge weight
},
{
Adj_vertex2: edge weight
}
]
}
来存储它与边缘权重相邻的顶点。
换句话说:
Adj_vertex2
有没有有效的方法呢?另外,如果我使用上面的结构,我如何访问typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; // DOS signature : 4D5A ("MZ")
}
?
答案 0 :(得分:1)
除非你有更复杂的结构,否则字典工作正常。但是你要为你的顶点声明一个字典列表。你可以像这样简化它;
D = { vertex1: {Adj_vertex1: edge_weight, Adj_vertex2: edge_weight}}
得到这样的adj_vertex2权重;
D[vertex1][Adj_vertex2]
或者,如果你想得到一个默认值,如果一个顶点不与另一个顶点相邻,那么你就可以使用这个了解字典(感谢Hossein的评论):
D[vertex1].get(Adj_vertex2, 0)
并添加一个像这样的新顶点;
D[new_vertex] = {Adj_vertex1: edge_weight, Adj_vertex2: edge_weight}
答案 1 :(得分:1)
你可以这样做:
d = {'vertex1': [ {'adj_vertex1': (edge, weight)}, {'adj_vertex2': (edge, weight)}]}
要访问adj_vertex2
,您必须d['vertex1'][1]['adj_vertex2']
在我看来,这不是一个在python中使用图形的好方法。您应该检查一些库,如python-graph,或者您可以使用sets,就我记忆而言,集合是使用python图形的好方法。
注意:(this, is, a, tuple)
。在tuples。
答案 2 :(得分:0)
使用相对标准工具的一种有效方法是将邻接存储为稀疏矩阵。这需要您使用scipy
并对顶点进行编号。
假设您将连接的顶点作为列表列表,并将权重作为另一个相同结构的列表列表
inds = [[1,3], [], [0,2], [0,2,3]]
weights = [[0.1,0.2], [], [1,1], [2,0.5,-0.1]]
adj = sparse.lil_matrix((4,4))
for i, (j, w) in enumerate(zip(inds, weights)):
adj[i, j] = w
adj
# <4x4 sparse matrix of type '<class 'numpy.float64'>'
with 7 stored elements in LInked List format>
adj.A # dense representation
# array([[ 0. , 0.1, 0. , 0.2],
[ 0. , 0. , 0. , 0. ],
[ 1. , 0. , 1. , 0. ],
[ 2. , 0. , 0.5, -0.1]])
adj = adj.tocsr() # convert to more efficient format
# get vertices connected to vertex 3:
adj[3].nonzero()[1]
# array([0, 2, 3], dtype=int32)
# get corresponding weights:
adj[3].data
# array([ 2. , 0.5, -0.1])
答案 3 :(得分:0)
使用元组列表存储邻接和权重对我来说更有意义,而不是将其存储为dict。你可以存储这样的东西,
d = {
'v1': [ ('v2',w1), ('v3', w2) ]
'v2': [ ('v1', w1) ]
'v3': [ ('v1', w2) ]
}