首页 > 解决方案 > 借助字典键填充虚拟矩阵

问题描述

我想使用字典键来获取它们各自的值,然后使用这些值来引用我的二维数组中的某些元素。

我确实有一个像这样创建的二维虚拟矩阵:

self.matrix = [[0] * self.length] * self.length

根据长度创建一个 N x N 矩阵

我还有一个具有名称(=键)的节点的排序列表,我想将这些名称映射到索引(=值)0..N

self.data = dict(zip(self.nodes, self.index_array))

在我尝试用“1”填充我的虚拟邻接矩阵之前,这一切都很好,因为 Ni 连接到 Nj。"edges" 是一个元组列表: edges = [("u1","v1"),("u1","v2"),...,("ui","uj")]

for row in edges:
    self.matrix[self.data[row[0]]][self.data[row[1]]] = 1

现在,当我运行上面的方法时,我得到一个充满矩阵的矩阵,而节点 u 和节点 v 之间的每个连接都应该只有一个矩阵


我尝试以较小的方式对这个问题进行建模,在这里它完美地工作了!我不知道发生了什么事。

a = {"3": 0, "4": 1, "5": 2}
edges = [("3", "5"), ("4", "3"), ("5", "3")]
nodes = ["3", "4", "5"]
index = [0, 1, 2]

data = dict(zip(nodes, index))

matrix = [[0, 0, 0],
          [0, 0, 0],
          [0, 0, 0]]

for row in edges:
    matrix[data[row[0]]][data[row[1]]] = 1

print(a)
print(data)
print(matrix)

标签: pythondictionaryadjacency-matrix

解决方案


通过在*子列表列表上使用运算符,您重复对子列表的相同引用,因此对子列表所做的任何更改都将反映在对子列表具有相同引用的所有其他项目上。

self.matrix您可以改为使用列表推导进行初始化:

self.matrix = [[0] * self.length] for _ in range(self.length)]

推荐阅读