这是我的代码:
def vmm(v, M):
d = {}
domain = [(i,j) for i in M.D[0] for j in M.D[1]]
for k in M.D[1]:
for i in domain:
if i[1] == k:
f = 0
f += M[i]*v[i[0]]
d[i] = f
return d
它返回:
{(3, 'b'): 0, (3, 'a'): 0, (1, 'b'): 2, (2, 'a'): -8, (3, 'c') '): 0, (2, 'b'): 0, (2, 'c'): 0, (1, 'a'): 0, (1, 'c'): 0}
这几乎是我想要的,我希望每个键成为元组的第二个元素,所以它们的键将是“a”、“b”或“c”,其中值是所有值的总和以“a”、“b”、“c”作为第二个元素的值。
我尝试将 return 语句之前的最后一行替换为:
d[1][i] = f
这会返回一个所有值都为零的字典,这不是我想要的。
编辑
def vector_matrix_mul(v, M):
d = {}
e = {}
domain = [(i,j) for i in M.D[0] for j in M.D[1]]
for k in M.D[1]:
for i in domain:
if i[1] == k:
f = 0
f += M[i]*v[i[0]]
d[i] = f
for i in d:
for m in M.D[1]: #{'a', 'b', 'c'}
if i[1] == m:
for k in M.D[0]:
F = 0
F += i[m,k]
e[m] = F
return e
仍然不走运,如果有人可以帮助我解决这个问题,我不想使用额外的模块,只想修复我的代码。
M = Mat(M.D,M.f)
v = Vec(v.D,v.f)
所以 M.D 是矩阵的“域”,M.f 是矩阵的函数。 与向量类似。
一个例子...
>>> v1 = Vec({1, 2, 3}, {1: 1, 2: 8})
>>> M1 = Mat(({1, 2, 3}, {'a', 'b', 'c'}), {(1, 'b'): 2, (2, 'a'):-1, (3, 'a'): 1, (3, 'c'): 7})
注意 v 和 M 域中的不同维度。
最佳答案
使用默认字典,使用元组中的键并对每个值求和:
from collections import defaultdict
d=defaultdict(int)
domain = zip(M.D[0], M.D[1])
for vl, k in domain:
d[k] += M[(vl,k)] * v[vl]
我不明白 for k in M.D[1]
会出现在哪里,因为您的域列表中已经拥有所有 M.D[1] 项目。
关于python - 如何更改Python字典中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29018855/