将社区结构(列表)转换为邻接列表

时间:2019-06-07 05:14:57

标签: python algorithm data-structures depth-first-search breadth-first-search

给出社区结构(列表列表):

[[A,B,C], [B,D,E,G], [A,C,F,H],[F,K, H]]

并假定每个边的权重为1,在子组内未指向。

我想通过对每个人应用广度/深度优先搜索,找到最有影响力的人,他与G,F(最小边总数)的联系最短。

以下是广度优先搜索的通用代码:

def bfs_paths(graph, start, goal):
    queue = [(start, [start])]
    while queue:
        (vertex, path) = queue.pop(0)
        for next in graph[vertex] - set(path):
            if next == goal:
                yield path + [next]
            else:
                queue.append((next, path + [next]))

“图”应表示为邻接表。例如:

graph = {'A': set(['B', 'C', 'F', 'H']),
         'B': set(['D', 'E','G']),
         'C': set(['A', 'F', 'H']),
         'D': set(['B', 'E', 'G' ]),
         'E': set(['B', 'D', 'G' ]),
         'F': set(['K', 'H']),
         'G': set(['B', 'D', 'E'])
         'H': set(['K', 'F']}

主要问题:如何将社区结构(列表)转换为邻接列表?

侧面问题:还有其他合适的算法吗?

Edit1:我已经尝试遵循此stackoverflow post。但是我坚持改进代码以达到预期结果

2 个答案:

答案 0 :(得分:1)

这可能会得到预期的结果

A1=[['A','B','C'], ['B','D','E','G'], ['A','C','F','H'],['F','K', 'H']]
dict1={}
for l in A1:
    for i in l:
        dict1[i]=[]

for i in dict1:

        index=100
        for j in A1:
            try:

                if j.index(i)<index:
                    index=j.index(i)
                    dict1[i]=[]
                    for k in j:
                        if k!=i:
                            dict1[i].append(k)
            except:
                pass

答案 1 :(得分:1)

假设所有社区都已完全连接,则可以通过遍历组并使用setdefault在需要的地方添加新条目并添加节点来相当快地转换为邻接列表:

community = [['A','B','C'], ['B','D','E','G'], ['A','C','F','H'],['F','K','H']]

adj_list = {}

for group in community:
    for member in group:
        adj_list.setdefault(member, set()).update((set(group) - {member}))

adj_list将是:

{'A': {'B', 'C', 'F', 'H'},
 'B': {'A', 'C', 'D', 'E', 'G'},
 'C': {'A', 'B', 'F', 'H'},
 'D': {'B', 'E', 'G'},
 'E': {'B', 'D', 'G'},
 'G': {'B', 'D', 'E'},
 'F': {'A', 'C', 'H', 'K'},
 'H': {'A', 'C', 'F', 'K'},
 'K': {'F', 'H'}}

一种替代方法是使用defaultdict(set),然后您可以将其编入索引并以类似的方式进行更新。