2017-05-29 1 views
0

Ich habe ein Wörterbuch, das Wörterbücher enthält, die wiederum Wörterbücher ad infinitum enthalten können. Ich möchte jeden Schlüssel in allen Wörterbüchern ändern, mit Ausnahme der Schlüssel, die einem der verschachtelten Wörterbücher zugeordnet sind. Ich verstehe, dass die Schlüssel unveränderlich sind, was ich so etwas wie dies tun wollen:Wie Sie Schlüssel in einem Python-Wörterbuch von Wörterbüchern mit beliebiger Tiefe umbenennen

layer[item + '_addition'] = layer.pop(item) 

Was ich habe, ist gerade jetzt:

def alterKeys(item, layer=topLevelDict): 
    if isinstance(item, dict): 
     for i in item: 
      alterKeys(item[i], item) 
    else: 
     layer[item + '_addition'] = layer.pop(item) 

Das funktioniert nicht, da es immer wieder rekursiv reisen den Baum hinunter, bis die letzte Zeile versucht, einen Wert aus dem Dict zu holen, statt eines Schlüssels, der einen KeyError auslöst. Ich weiß, dass ich einer Lösung nahe bin, aber ich habe ein paar Minuten darüber nachgedacht und ich kann es nicht herausfinden.

Antwort

1

Während ich diese Frage schrieb, fand ich es heraus. Ich dachte, ich würde das hier posten, falls jemand anders irgendwann die gleiche Frage hat.

def alterKeys(item, layer=topLevelDict, key=None): 
    if isinstance(item, dict): 
     for k, v in item.items(): 
      alterKeys(v, item, k) 
    elif isinstance(key, str): 
     layer[key + '_addition'] = layer.pop(key) 

Wenn jemand eine elegantere oder sonst eine bessere Lösung hat, würde ich gerne sehen. Ich habe gerade dieses Skript getestet, indem ich eine JSON-Datei durch es ausgeführt habe, und es hat jeden Schlüssel umbenannt, der nicht zu einem Wörterbuch zugeordnet war, was genau das ist, was ich wollte.

Wenn ich alle Schlüssel umbenannt werden, einschließlich derjenigen, die in den verschachtelten Wörterbücher abgebildet wollte, könnte ich diesen Code verwenden statt:

def alterKeys(item, layer=topLevelDict, key=None): 
    if isinstance(item, dict): 
     for k, v in item.items(): 
      alterKeys(v, item, k) 
    if isinstance(key, str): 
     layer[key + '_addition'] = layer.pop(key) 

Wenn Sie python2 verwenden, denken Sie daran .iteritems() zu verwenden, anstelle von .items(), und verwenden Sie isinstance (key, basestring) anstelle von isinstance (key, str).

Verwandte Themen