Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Dict和List在Python中创建邻接列表_Python_Algorithm_List_Dictionary_Graph - Fatal编程技术网

使用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不阻止我更改其中的值吗?