2

私は Python を使用して線形代数を学習しており、2 つの辞書があります。

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]

少なくとも正しい答えはありますが、これを機能させることはできません。ここからどこへ行くべきか、あるいは正しい軌道に乗っているかどうかはわかりません。私の説明不足かもしれませんが申し訳ありません

4

2 に答える 2

5

複数の入力キーに基づいて値を設定しているため、内包表記ではなくループを使用してください。collections.defaultdictオブジェクトを使用すると、ロジックも少し簡単になります。

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})
于 2013-07-24T11:11:25.453 に答える