2016-09-30 4 views
0

Ich habe 2 dict, ein Original und eine für die Abbildung der Schlüssel des Original auf einen anderen Wert gleichzeitig, zum Beispiel:ändern mehrere Schlüssel des Wörterbuchs durch ein Mapping-Wörterbuch

original dict

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

Mapping dict

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

Es funktioniert gut, wenn ich den folgenden Code t verwenden o den Schlüssel des verschachtelten dict von Original-dict ändern, wie

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 

und das Ergebnis

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

so weit so gut, aber wenn ich eine dict mit mehreren Tastenbelegung auf dem gleichen Schlüssel zum Beispiel meine ursprüngliche dict ist wie

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

und die Abbildung dict mit mehr als 1 Keymapping auf den gleichen Wert, wie:

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

wie Sie sehen können, beide 'ajax-amsterdam-youth' und 'ajax-amsterdam-youth' zuordnen, 'ajax', und das Problem ist, wenn ich den gleichen Code verwenden, um sie auszuführen, die Größe des ursprünglichen dict hat während der Iteration

RuntimeError: dictionary changed size during iteration 
geändert

ich mag ähnlich Jede Hilfe zu schätzen wissen wird

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

ein Ergebnis mit verschachtelter Liste für den gleichen Schlüssel erhalten, danke, und ich werde schauen halten fo Eine Antwort von mir.


Antwort

0

Nun, ich eine Lösung dafür gefunden zu haben, der Code:

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 

achten Sie auf die for sub_row in built_dict[row].keys(): und setdefault() Verfahren verwendete ich, dass die Standard-Iteration für dict in python 2.7 zu glauben, ist nur Iterieren Sie die Tasten(), aber diesmal beweist es, es ist ein wenig anders, vielleicht haben Sie bessere Lösung, bitte zeigen Sie mir, und es wird dankbar sein, danke

+0

Nur ein Kopf, das wird nicht in Python 3 funktionieren (wobei '.keys()' eine Live-Ansicht des 'd zurückgibt ict', das sich auch über die Modifikation der mittleren Iteration beschweren wird. Wenn Sie es mit Py2 und Py3 kompatibel machen wollen, ändern Sie die Schleife zu 'for sub_row in tuple (built_dict [row]):' was eine flache Kopie garantiert, egal welche Version von Python Sie haben. – ShadowRanger

+0

Ja, danke, sowohl Liste als auch Tupel können verwendet werden, um eine Kopie zu erstellen und in Python 2.x und 3.x zu arbeiten – LancelotHolmes

Verwandte Themen