python - 借助字典键填充虚拟矩阵
问题描述
我想使用字典键来获取它们各自的值,然后使用这些值来引用我的二维数组中的某些元素。
我确实有一个像这样创建的二维虚拟矩阵:
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)
解决方案
通过在*
子列表列表上使用运算符,您重复对子列表的相同引用,因此对子列表所做的任何更改都将反映在对子列表具有相同引用的所有其他项目上。
self.matrix
您可以改为使用列表推导进行初始化:
self.matrix = [[0] * self.length] for _ in range(self.length)]
推荐阅读
- android - How can I store the user number like this (1,2,3...)?
- actionscript-3 - How can I pass an arbitrary group of parameters “through” a method?
- vue.js - 如何在 Vue 2 中创建具有验证功能的 VForm 组件,如 Vuetify?
- reactjs - Iterate over array with nested objects
- android - How can I put the radiobutton icon in the center of the MaterialRadioButton View?
- javascript - 如何过滤掉反应表中日期范围之间的日期
- javascript - Javascript use value of variable after function
- python - How to reverse a sublist in python
- reactjs - Transcribing javascript to react [Cesium]
- r - How to plot multiple graphs into one using ggplot?