这是我的代码:
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,&# 39; c'):0,(1,' a'):0,(1,' c'):0}
这几乎是我想要的,我希望每个键都是元组的第二个元素,所以它们的键将是' a'' b'或者' c',其中值是' a',''' c'所有值的总和。作为第二个要素。
我尝试用return:
替换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域中的不同维度。
答案 0 :(得分:1)
使用元组中的键并对每个值求和来使用defaultdict:
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]项目。
答案 1 :(得分:0)
我不知道我是否理解了你的问题。让我尝试。
要改变字典中的键: