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.
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
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