python - 从元组列表生成邻接矩阵的更优雅的方法

标签 python function graph adjacency-matrix

假设我们从一个由元组列表表示的“友谊”图开始,

friendships = [(0, 1), (0, 2), (1, 2), (1, 3), (2,
3), (3, 4),(4, 5), (5, 6), (5, 7), (6, 8), (7, 8), (8, 9)]

其中元素 0 是 1 的友元(因此 1 是 0 的友元)。

我想从头开始构建邻接矩阵,这种方式始终适用于这种类型的元组表示。

我有以下(令人反感的)Python 代码:

def make_matrix(num_rows,num_cols,entry_fn):
    return [[entry_fn(i,j)
             for j in range(num_cols)]
            for i in range(num_rows)]
def adjacency(connections):
    new=connections+[(x[1],x[0]) for x in connections]
    elements=list(set([x[0] for x in connections]+ [x[1] for x in connections]))
    def test(i,j):
        if (elements[i],elements[j]) in new:
            return 1
        else: return 0
    return make_matrix(len(elements),len(elements),test)

我知道它效率低下而且非常丑陋。有没有更聪明的方法来解决这个问题?我上面给出的示例列表的输出应该是

[[0, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [1, 0, 1, 1, 0, 0, 0, 0, 0, 0],
 [1, 1, 0, 1, 0, 0, 0, 0, 0, 0],
 [0, 1, 1, 0, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 0, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 1, 0, 0, 1, 0],
 [0, 0, 0, 0, 0, 1, 0, 0, 1, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 0, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]]

更新: 根据其中一个答案,我有以下可能的解决方案,尽管我不知道它是否更好

def adj(connections):
    ##step 1
    temp=(set(elem[0] for elem in connections).union(
        set(elem[1] for elem in connections)))
    n=max(temp)+1
    ans=[]
    ##step 2
    for i,_ in enumerate(temp):
        ans.append([])
        for j,_ in enumerate(temp):
            ans[i].append(0)
    ##step 3
    for pair in connections:
        ans[pair[0]][pair[1]]=1
        ans[pair[1]][pair[0]]=1
    return ans

最佳答案

我的算法是这样的:

  1. 找到最大的顶点id。调用此 n
  2. 创建一个 n+1 by n+1 零数组。将此称为 M
  3. 对于输入列表中的每一对x, y,设置M[x][y] = 1

为了提出这个解决方案,我首先想到了步骤 3。对于给定的输入,这似乎是填充邻接矩阵的最直接的方法。但是,它需要一个固定大小的二维数组。所以问题是我如何找出第 2 步的 n。从那里不需要太多考虑就可以找出第 1 步是需要什么。

细节留给读者作为练习。

关于python - 从元组列表生成邻接矩阵的更优雅的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56134879/

相关文章:

python - 使用 gunicorn 进行流式传输

python - 使用 imgaug 增加数据集大小

python - 为什么这段代码不能作为函数运行?

c++ - 我可以创建类内函数类型吗?

将文档中属于同一部分的部分分组的算法

linux - 从 munin 数据中删除单个样本

android - MPAndroidChart 有没有办法为不同的条设置不同的颜色?

python - 删除这些元组列表中重复的列表组合的元组

python - 将 3D 数组除以 2D 行总和?

c++ - 编写一个函数,计算并返回两个目标数字之间可被 3 整除的整数总数