2016-08-23 13 views
3

私はdict1 - dict2を減算しようとしています。結果は、犬のための負の数であれば、私は概念の学習にちょうど興味があります、それは問題ではありません:)2つの辞書の値を減算する

owner = ['Bob', 'Sarah', 'Ann'] 

dict1 = {'Bob': {'shepherd': [4,6,3],'collie': [23, 3, 45], 'poodle':[2,0,6]}, {'Sarah': {'shepherd': [1,2,3],'collie': [3, 31, 4], 'poodle': [21,5,6]},{'Ann': {'shepherd': [4,6,3],'collie': [23, 3, 45], 'poodle': [2,10,8]}} 


dict2 = {'Bob': {'shepherd': 10,'collie': 15,'poodle': 34},'Sarah': {'shepherd': 3,'collie': 25,'poodle': 4},'Ann': {'shepherd': 2,'collie': 1,'poodle': 0}} 

私が欲しい:

wanted = dict1 = {'Bob': {'shepherd': [-6,-4,-7],'collie': [8, -12, 30], 'poodle':[-32,-34,-28]}, {'Sarah': {'shepherd': [-2,-1,0],'collie': [-22, 6, -21], 'poodle': [17,1,2]},{'Ann': {'shepherd': [2,4,1],'collie': [22, 2, 44], 'poodle': [2,10,8]}} 

は、私はまだ辞書に新しいですので、ここで私が試してきたものですが、タイプエラーはありません。私はdict1がdict2よりも多くの値を持っていると仮定していますが、上記の計算を実行する方法を見つけることができません。

wanted = {} 

for i in owner: 
    wanted.update({i: dict1.get(i) - dict2.get(i)}) 

答えて

6

ネストされた辞書の理解を使用できます。私はあなたの辞書をちょっと微調整しました。なぜなら、それは正しい構文ではなかったからです(いくつかの中括弧が追加されました)。辞書の中のキーだけを使うことができるので、オーナーの配列は必要ありません。

dict1 = { 
    'Bob': { 
     'shepherd': [4, 6, 3], 
     'collie': [23, 3, 45], 
     'poodle': [2, 0, 6], 
    }, 
    'Sarah': { 
     'shepherd': [1, 2, 3], 
     'collie': [3, 31, 4], 
     'poodle': [21, 5, 6], 
    }, 
    'Ann': { 
     'shepherd': [4, 6, 3], 
     'collie': [23, 3, 45], 
     'poodle': [2, 10, 8], 
    } 
} 
dict2 = { 
    'Bob': {'shepherd': 10, 'collie': 15, 'poodle': 34}, 
    'Sarah': {'shepherd': 3, 'collie': 25, 'poodle': 4}, 
    'Ann': {'shepherd': 2, 'collie': 1, 'poodle': 0}, 
} 
wanted = { 
    owner: { 
     dog: [num - dict2[owner][dog] for num in num_list] 
     for dog, num_list in dog_dict.iteritems() 
    } for owner, dog_dict in dict1.iteritems() 
} 
print wanted 

出力:

{ 
    'Sarah': { 
     'shepherd': [-2, -1, 0], 
     'collie': [-22, 6, -21], 
     'poodle': [17, 1, 2] 
    }, 
    'Bob': { 
     'shepherd': [-6, -4, -7], 
     'collie': [8, -12, 30], 
     'poodle': [-32, -34, -28] 
    }, 
    'Ann': { 
     'shepherd': [2, 4, 1], 
     'collie': [22, 2, 44], 
     'poodle': [2, 10, 8] 
    } 
} 

これはdict2はdict1と同じキーのすべてを持っていることを想定しています。そうでない場合は、KeyErrorを避けるためにいくつかのデフォルト値を設定する必要があります。

EDIT:ここではそれに慣れていない人のための辞書理解を解釈する方法を簡単に説明します。あなたがリスト内包にもっと慣れていれば、辞書の理解は非常に似ています。リストの代わりに辞書を作成するだけです。したがって、{i: str(i) for i in xrange(10)}{0: '0', 1: '1', ..., 9: '9'}の辞書を提供します。

これをソリューションに適用できます。このコード:

wanted = { 
    owner: { 
     dog: [num - dict2[owner][dog] for num in num_list] 
     for dog, num_list in dog_dict.iteritems() 
    } for owner, dog_dict in dict1.iteritems() 
} 

は同等です:

wanted = {} 
for owner, dog_dict in dict1.iteritems(): 
    wanted[owner] = {} 
    for dog, num_list in dog_dict.iteritems(): 
     wanted[owner][dog] = [num - dict2[owner][dog] for num in num_list] 
+0

あなたは、ネストされた辞書の理解の考え方を説明していただけますか?リースでdict1を反復する方法。問題は非常に面白いですが、答えは私に巻き込まれます。 – Monica

+1

@Monica:私は答えが畳み込まれていることに同意しない:それはそれを行うのが最も単純で無作法である。最初にあなたを混乱させるかもしれないのは、あなたが3つのネストされたリスト/ディクテーションの理解を持っているという事実です。それを理解するには、1から1を内側から崩してみてください。 – Julien

+1

@Monica - ネストされた辞書の理解を少し説明しようとする脚注を追加しました。キーは、各レイヤーをステップするだけです。 Julienが指摘したように、これはかなりPythonicな構造で、価値のあることを学ぶ価値があります。 – Karin

関連する問題