使用Dict和List在Python中创建邻接列表
我想创建一个数据结构,可以存储顶点的名称,它相邻的顶点以及边权重。我想创建一个使用Dict和List在Python中创建邻接列表,python,algorithm,list,dictionary,graph,Python,Algorithm,List,Dictionary,Graph,我想创建一个数据结构,可以存储顶点的名称,它相邻的顶点以及边权重。我想创建一个dict,将一个顶点映射到一个列表,该列表进一步具有dict,以存储它与边权重相邻的顶点 换言之: D = { vertex1: [ { Adj_vertex1: edge weight }, { Adj_vertex2: edge weight } ] } 有没有一个有效的方法来
dict
,将一个顶点映射到一个列表
,该列表进一步具有dict
,以存储它与边权重相邻的顶点
换言之:
D = {
vertex1: [
{
Adj_vertex1: edge weight
},
{
Adj_vertex2: edge weight
}
]
}
有没有一个有效的方法来做到这一点?此外,如果使用上述结构,如何访问
Adj_vertex2
除非你有更复杂的结构,否则字典很好用。但您正在为顶点声明一个字典列表。你可以这样简化它
D = { vertex1: {Adj_vertex1: edge_weight, Adj_vertex2: edge_weight}}
D[vertex1][Adj_vertex2]
D[new_vertex] = {Adj_vertex1: edge_weight, Adj_vertex2: edge_weight}
然后像这样调整顶点2的权重
D = { vertex1: {Adj_vertex1: edge_weight, Adj_vertex2: edge_weight}}
D[vertex1][Adj_vertex2]
D[new_vertex] = {Adj_vertex1: edge_weight, Adj_vertex2: edge_weight}
如果一个顶点与另一个顶点不相邻,因此字典中不存在该顶点,则可以使用该值(感谢Hossein的评论):
然后像这样添加一个新顶点
D = { vertex1: {Adj_vertex1: edge_weight, Adj_vertex2: edge_weight}}
D[vertex1][Adj_vertex2]
D[new_vertex] = {Adj_vertex1: edge_weight, Adj_vertex2: edge_weight}
你可以做:
d = {'vertex1': [ {'adj_vertex1': (edge, weight)}, {'adj_vertex2': (edge, weight)}]}
要访问adj_vertex2
必须执行d['vertex1'][1]['adj_vertex2']
在我看来,在python中使用图形不是一个很好的方法。您应该检查一些库,比如或者您可以使用,就我所记得的,集合是在python中使用图形的好方法
注意:
(这是一个元组)
。使用相对标准的工具的一种有效方法是将邻接存储为稀疏矩阵。这需要您使用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])
inds=[[1,3],[0,2],[0,2,3]]
权重=[[0.1,0.2],[1,1],[2,0.5,-0.1]]
adj=稀疏的lil_矩阵((4,4))
对于枚举(zip(inds,weights))中的i,(j,w):
adj[i,j]=w
形容词
#
形容词A#稠密表示
#数组([[0,0.1,0,0.2],
[ 0. , 0. , 0. , 0. ],
[ 1. , 0. , 1. , 0. ],
[ 2. , 0. , 0.5, -0.1]])
adj=adj.tocsr()#转换为更高效的格式
#获取连接到顶点3的顶点:
形容词[3]。非零()
#数组([0,2,3],dtype=int32)
#获取相应的权重:
形容词[3]。数据
#数组([2,0.5,-0.1])
使用元组列表来存储邻接和权重对我来说比将其存储为dict更有意义。您可以这样存储它
d = {
'v1': [ ('v2',w1), ('v3', w2) ]
'v2': [ ('v1', w1) ]
'v3': [ ('v1', w2) ]
}
为什么要有一个dict列表而不仅仅是一个dict:
D={vertex1:{Adj_vertex1:weight,Adj_vertex2:weight}
那么访问就像D[vertex1][Adj_vertex2]
一样简单,但更可能在循环中用于D[vertex1]中的v,w。items():
我可以这样做,但这是最有效的吗?另外,如何提取顶点2的权重?通过写入:D[顶点][顶点2]?我需要此数据结构,首先:访问与顶点1相邻的顶点,然后:访问边权重。请注意,我更改了代码中变量的名称,这是因为它们与pep-8()不一致。请使用D[vertex1]。获取(顶点2,0)
如果vertex2
与vertex1
不相邻,则获取weight=0
,谢谢!但这是有效的方法吗?我的想法是我首先想到的。我想学习创建能够容纳相邻顶点和权重的东西的有效方法。@BinamrataSharma我确信有更好的方法(为了可读性和功能性)来表示这个问题,字典在这种情况下起作用,但更多信息请查看LaraChicharo的答案。如果我必须更改边权重a的值,我会怎么做?tuple不阻止我更改其中的值吗?