使用Dict和List在Python中创建邻接列表

时间:2017-03-16 02:52:12

标签: python algorithm list dictionary graph

我想创建一个数据结构,可以存储顶点的名称,它与边缘权重相邻的顶点。我想过创建一个dict,它将顶点映射到listdict还有D = { vertex1: [ { Adj_vertex1: edge weight }, { Adj_vertex2: edge weight } ] } 来存储它与边缘权重相邻的顶点。

换句话说:

Adj_vertex2

有没有有效的方法呢?另外,如果我使用上面的结构,我如何访问typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // DOS signature : 4D5A ("MZ") }

4 个答案:

答案 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) ]
        }