Python 2.7 从边列表构造邻接列表?

Python 2.7 从边列表构造邻接列表?,python-2.7,graph,graph-algorithm,Python 2.7,Graph,Graph Algorithm,在图形算法的上下文中,我们通常会得到一个方便的图形表示(通常作为邻接列表或邻接矩阵)来进行操作 我的问题是,从所有边的给定列表中构造邻接列表的有效方法是什么 在本问题中,假设边是元组列表(如python中),并且(a,b)表示从a到b的定向边。一组itertools.groupby()、排序和dict理解可以让您开始: from itertools import groupby edges = [(1, 2), (2, 3), (1, 3)] adj = {k: [v[1] for v in

在图形算法的上下文中,我们通常会得到一个方便的图形表示(通常作为邻接列表或邻接矩阵)来进行操作

我的问题是,从所有边的给定列表中构造邻接列表的有效方法是什么


在本问题中,假设边是元组列表(如python中),并且(a,b)表示从a到b的定向边。

一组
itertools.groupby
()、排序和
dict
理解可以让您开始:

from itertools import groupby

edges = [(1, 2), (2, 3), (1, 3)]

adj = {k: [v[1] for v in g] for k, g in groupby(sorted(edges), lambda e: e[0])}
# adj: {1: [2, 3], 2: [3]}

这将按边的源节点对边进行排序和分组,并为每个源节点存储目标节点的
列表。现在,您可以通过
adj[1]
一组
itertools访问
1
的所有相邻节点。groupby
()、排序和
dict
理解可以让您开始:

from itertools import groupby

edges = [(1, 2), (2, 3), (1, 3)]

adj = {k: [v[1] for v in g] for k, g in groupby(sorted(edges), lambda e: e[0])}
# adj: {1: [2, 3], 2: [3]}
这将按边的源节点对边进行排序和分组,并为每个源节点存储目标节点的
列表。现在,您可以通过
adj[1]