2017-10-03 8 views
2

同じキーで2つの辞書の値の乗算の問題を掛けると、私が決めた:が異なるキーを持つ辞書の値

v1={'name1': '10', 'name2': '20'} 
v2={'name1': '4', 'name2': '5'} 

foo = lambda dct_1, dct_2: {key: int(dct_2[key]) * int(dct_1[key]) for key in dct_2} 

foo(v1, v2) 
# Out: {'name1': 40, 'name2': 100} 

私は同じように2つの辞書の値を掛けることができますどのように、異なるキーを使用していますか?

あなたは常に nameXquantityX値を対応していると仮定すると、あなたがキーに置き換えるシンプルを使用することができ
v1={'name1': '10', 'name2': '20'} 
v2={'quantity1': '4', 'quantity2': '5'} 

#OUT: {'name1':'40', 'name2': '100'} 
+1

各「dict」のキー名には同じ番号が含まれていますか? – Dadep

+2

非常に注意してください。 Dictsは注文されていないので、どの要素を一緒に乗算するかをどのように知っていますか?代わりにcollections.OrderedDictの使用を検討してください。 –

+0

こんにちは!私はちょうど例を思いついた。この例では、はいです。しかし、この例では一般的に、キーの名前が違うことを強調したかったのです。あなたのコメントありがとう – Yaroslav

答えて

2

あなたの辞書が、これはトリックを行う必要が同じ大きさであると仮定すると
foo = lambda dct_1, dct_2: {key: int(dct_2[key.replace('name', 'quantity')]) * int(dct_1[key]) for key in dct_1} 
1
multiplydicts = lambda x,y: { key: str(int(v1[key]) * int(val)) for key,val in zip(v1.keys(), v2.values())} 

を、v2.values()はv2の値を構築順に返します。

あなたが行うことができます
1

>>> v1={'name1': '10', 'name2': '20'} 
>>> v2={'quantity1': '4', 'quantity2': '5'} 
>>> d={'name'+str(i+1) : int(v1['name'+str(i+1)])*int(v2['quantity'+str(i+1)]) for i in range(len(v1))} 
>>> d 
{'name2': 100, 'name1': 40} 
1

は、あなただけの第二のものに最初の辞書内のキーをマップするために何かを追加する必要があります。これを行う最も簡単な方法は、下のコードのkeymapという名前の第3の辞書です。最初の辞書のキーは、返されたものに現れるキーを決定します。

通常の辞書のキーの順序は定義されていないため、これは必要です。そのため、反復するときにどのような順序が表示されるかを予測することはできません。

v1={'name1': '10', 'name2': '20'} 
v2={'quantity1': '4', 'quantity2': '5'} 
keymap = {'name1': 'quantity1', 'name2': 'quantity2'} # Added. 

foo = (lambda dct_1, dct_2: 
     {key: int(dct_2[keymap[key]]) * int(dct_1[key]) for key in dct_1}) 

print(foo(v1, v2)) # -> {'name1': 40, 'name2': 100} 
関連する問題