2016-09-30 8 views
0

I持っ2のdict、元のインスタンスのために、同時に別の値に元の人のキーをマッピングするための1つ:マッピング辞書によって辞書の複数のキーを変更

元辞書

built_dict={'China':{'deportivo-cuenca-u20':{'danny':'test1'}}, 
      'Germany':{'ajax-amsterdam-youth':{'lance':'test2'}}} 

マッピング辞書

club_team_dict={'deportivo-cuenca-u20':'deportivo','ajax-amsterdam-youth':'ajax'} 

私は次のコードのトンを使用する場合、それがうまく機能、O

def club2team(built_dict,club_team_dict): 
for row in built_dict: 
    # print test_dict[row] 
    for sub_row in built_dict[row]: 
     for key in club_team_dict: 
      # the key of club_team_dict must be a subset of test_dict,or you have to check it and then replace it 
      if sub_row==key: 
       built_dict[row][club_team_dict[sub_row]] = built_dict[row].pop(sub_row) 
return built_dict 

のように、オリジナルの辞書のネストされた辞書のキーを変更し、結果

{'Germany': {'ajax': {'lance': 'test2'}}, 'China': {'deportivo': {'danny': 'test1'}}} 

これまでのところは良い、しかし私は、同じに複数のキーマッピングを持つ辞書を持っている場合キーは、例えば、私のオリジナル辞書は

built_dict={'China':{'deportivo-cuenca-u20':{'danny':'test1'}}, 
      'Germany':{'ajax-amsterdam-youth':{'lance':'test2'}, 
         'ajax-amsterdam':{'tony':'test3'}}} 

など同じ値にもっとして1つのキーマッピングとマッピング辞書、のようなものです:

club_team_dict={'deportivo-cuenca-u20':'deportivo', 
       'ajax-amsterdam-youth':'ajax', 
       'ajax-amsterdam':'ajax'} 

あなたが見ることができるように、'ajax-amsterdam-youth''ajax-amsterdam-youth'両方が'ajax'にマッピングされている、と私はそれを実行するために同じコードを使用する際のトラブルは、オリジナルの辞書のサイズが反復

RuntimeError: dictionary changed size during iteration 
中に変更されていています

私は、すべてのヘルプは感謝されます。この

{'Germany': {'ajax':[{'lance': 'test2'}, 
        {'tony' : 'test3'}]}}, 
'China': {'deportivo': [{'danny': 'test1'}]}} 

のように同じキーのためのネストされたリストで結果を取得したいあなたに感謝し、私はfoを探し続けるだろうr自分で答える。


答えて

0

は、まあ、私はこのための解決策を発見した、コード:for sub_row in built_dict[row].keys():setdefault()方法に

def club2team(built_dict,club_team_dict): 
for row in built_dict: 
    # print test_dict[row] 
    for sub_row in built_dict[row].keys(): 
     for key in club_team_dict: 
      # the key of club_team_dict must be a subset of test_dict,or you have to check it and then replace it 
      if sub_row==key: 
       # built_dict[row][club_team_dict[sub_row]] = built_dict[row].pop(sub_row) 
       built_dict[row].setdefault(club_team_dict[sub_row],[]).append(built_dict[row].pop(sub_row)) 
return built_dict 

注意を払うが、私はpython 2.7で、辞書のデフォルトの繰り返しがちょうどであることを信じるように使用しましたキー()を繰り返しますが、今回は少し違っていることが証明されています。もっと良い解決策がありますので、私に見せてください。ありがとうございます。

+0

これはPython 3ではうまくいきません( '.keys()'は 'dのライブビューを返しますict'は中間反復の変更についても不平を言います)。 Py2とPy3の両方と互換性を持たせたい場合は、ループを 'for sub_row in tuple(built_dict [row]):'に変更して、使用しているPythonのバージョンに関係なくシャローコピーを保証します。 – ShadowRanger

+0

ありがとうございます。リストまたはタプルを使用して、コピーを作成し、Python 2.xおよび3.xの両方で使用できます – LancelotHolmes