2016-06-27 7 views
0

は、私は次の3つの辞書を持っていると言う:ある辞書の値を別の辞書にマップ/割り当て/置き換える方法は?

General case: 

d1 = {'c_choice1': '1.10', 'c_choice2': '1.20',...} 
d2 = {'John': {'strength': 'choice1', 'agility': 'choice2',...},...} 
d3 = {'John': {'choice1': 'c_choice1', 'choice2': 'c_choice2',...},...} 

d2 and d3 can be: 

d2 = {'John': {'strength': 'choice1', 'agility': 'choice2'}, 'Kevin': {'int': 'choice1'}} 
d3 = {'John': {'choice1': 'c_choice1', 'choice2': 'c_choice2'}, 'Kevin': {'choice1': 'c_choice1'}} 

or 

d2 = {'John': {'strength': 'choice1', 'agility': 'choice1'}} 
d3 = {'John': {'choice1': 'c_choice1'}} 

私は(例として、一般的なケースを使用して)何をしたいか:

a)のD3から、choice1 = c_choice1、choice2 = c_choice2など聞かせて

choice1 = c_choice1 
choice2 = c_choice2 

b)は、ルックアップd1とc_choice1、c_choice2の値を見つける、など

d4 = {'John': {'strength': '1.10', 'agility': '1.20',...}...} 

注:

C)

マイ所望の出力()の例のような一般的なケースを使用して、D1の値に置き換えD2に等choice1、choice2、を有する最終辞書を作成a)入力ファイルからデータを抽出するときに3つの辞書が作成されますが、キーと値は自分で定義されていないため、辞書のキーと値の順序はわかりません。

b)私はPython 2.7を使用しています。

どうすればいいですか?

答えて

2

更新版:コメントで与えられた情報に基づいて、私は同じ選択値の複数のインスタンスを処理するために私の解決策を変更しました、またはインスタンスが見つからない場合はd2になります。ここに新しいソリューションがあります。私はそれが要求されたことをすると信じています。私は、新しい機能を行使するために、サンプルデータを変更した:choice1d2で二回発生し、choice2が不在であることを

{'John': {'agility': '1.10', 'strength': '1.10'}} 

注:ここでは

d1 = {'c_choice1': '1.10', 'c_choice2': '1.20'} 
d2 = {'John': {'strength': 'choice1', 'agility': 'choice1'}} 
d3 = {'John': {'choice1': 'c_choice1', 'choice2': 'c_choice2'}} 

d4 = {} 
for k in d3: 
    d2x = d2[k] 
    d3x = d3[k] 

    d2y = {v: [] for x in (d2x.values(), d3x.keys()) for v in x} 
    for k2 in d2x: 
     d2y[d2x[k2]].append(k2) 

    d4x = {v2 : d1[d3x[k3]] for k3 in d3x for v2 in d2y[k3]} 
    d4[k] = d4x 

d4がどのように見えるかです。

+0

ありがとうございます。しかし、私の 'd2'と' d3'がこの形式であれば 'd2 = {'John':{'strength': 'choice1'、 'agility': 'choice1'}}'、 'd3 = {'John '' {'{' choice1 ':' c_choice1 '}} 'と' {'John':{'agility': '1.10'、 'strength': '1.10'}}'のいずれかの変更が必要ですか?私はあなたのコードを使用しようとしましたが、動作しません。 –

+0

d3は 'd3 = {'John':{'choice1': 'c_choice1'、 'choice2': 'c_choice2'}}' '' choice2'が 'd2'に見つかりません –

+0

元の投稿から 'choice1'が' d2'の与えられたエントリーに複数回現れることがあります。私は見て、私はこれを変更できるかどうかを見ていきます。 –

1

あなたは、単一のネストされたdictの理解としてこれを行うことができます:

d4 = {name: {stat: d1[d3[name][choice]] 
      for name, choices in d2.items() 
      for stat, choice in stats.items()} 
     for name, stats in d2.items()} 

それは理解することはほとんど不可能です。代わりに、ループとdict compはうまくいきます。

d4 = {} 
for name, stats in d2.items(): 
    d4[name] = {stat: d1[d3[name][choice]] for name, choices in d2.items() 
              for stat, choice in stats.items()} 
+0

ありがとうございました。しかし、私の 'd2'と' d3'がこの形式であれば 'd2 = {'John':{'strength': 'choice1'、 'agility': 'choice2'} 'Kevin' : 'choice1': 'choice1'}}} '、' d3 = {'John':{'choice1': 'c_choice1'、 'choice2': 'c_choice2'}、 'Kevin':{'choice1': 'c_choice1'}} 'そして私の希望する出力は次のとおりです: '{'John':{'agility': '1.20'、 'strength': '1.10'} 'Kevin' {{int ':' 1.10 '}}' ?私はあなたのコードを使用しようとしましたが、動作しません。 –

0

キーを繰り返してデータを抽出する必要があります。例えば:D2から名前を抽出するために

for name in d2: 
    print name 

出力
ジョン

各名称辞書を抽出:

for name in d2: 
    for choice in d2[name]: 
     print choice 

出力
機敏
強度

関連する問題