2013-07-24 88 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個循環(一個嵌套),只需一個循環就可以完成。 –