2013-07-24 47 views
2

我使用Python来学习线性代数和我有两个字典:的Python:字典乘法

v = {1: 1, 2: 8, 3: 0} 

M = {(1, 2): 2, (3, 1): 1, (3, 3): 7, (2, 1): -1} 

,我想打一个字典,将所有的元素,它的键在v中与M中的元组的第一部分是相同的。我想在这里作为这两个字典的答案的例子。 (我会告诉我想要做的计算)

newDict = {1: 1*M[(1, 2)], 2: 8*M[(2, 1)], 3: 0*M[(3, 1)]+0*M[(3, 3)] 

这是一样的:

newDict = {1: 1*2, 2: 8*-1, 3: 0*1+3*7} 

,所以我得到一个最终的字典形式

newDict = {1:2, 2:-8, 3:0} 

,你可以请看,我需要与字典v中相同的密钥。最近的我得到的是:

>>> [v[k]*M[r] for k in v for r in M if k == r[0]] 
[2, -8] 

我在哪里至少有正确的答案,但我无法得到这个工作。我不知道该从哪里出发,或者我是否处于正确的轨道。对不起,如果我的解释可能缺乏

+3

它必须是'3:0 * 1 + 0 * 7'? –

+0

你正在用这种方法增加所有的东西,对吧?你不是在说“把乘法加在一起”的部分。 – Jblasco

+0

也许你应该开始解释,你正在试图写一个稀疏矩阵和一个稀疏矢量的乘法... – hivert

回答

5

因为你是基于多个输入键值,使用循环,而不是理解。使用collections.defaultdict object使得逻辑太简单了一点:

from collections import defaultdict 

newDict = defaultdict(int) 
for x, y in M: 
    newDict[x] += M[x, y] * v.get(x, 0) 

输出:

>>> from collections import defaultdict 
>>> v = {1: 1, 2: 8, 3: 0} 
>>> M = {(1, 2): 2, (3, 1): 1, (3, 3): 7, (2, 1): -1} 
>>> newDict = defaultdict(int) 
>>> for x, y in M: 
...  newDict[x] += M[x, y] * v.get(x, 0) 
... 
>>> newDict 
defaultdict(<type 'int'>, {1: 2, 2: -8, 3: 0}) 
+0

我写的完全一样! – hivert

+0

在Dvorak布局FTW上盲打。 :-) –

+0

这太酷了 – TerryA

1

这个怎么样..

newD = {k : 0 for k in v} 
for k in v: 
    for r in M: 
     if k == r[0]: newD[k] += v[k]*M[r] 
+1

对不起,更新。 – rnbcoder

+1

你仍然可以使用'dict.fromkeys(v,0)'而不是dict理解。你的代码使用3个循环(一个嵌套),只需一个循环就可以完成。 –