如何在python中更改字典中的键

时间:2015-03-12 19:41:29

标签: python

这是我的代码:

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域中的不同维度。

2 个答案:

答案 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)

我不知道我是否理解了你的问题。让我尝试。
要改变字典中的键:

  • 查找密钥k_old是否存在
  • 将其值复制到变量v
  • 从字典中删除与k_old对应的条目
  • 使用值为v
  • 的新密钥k_new添加新条目