2016-07-30 9 views
2

Lasst uns sagen, ich habe ein dict wieWie in gestapelt dict tauchen anmutig

{ 
    "key_a": "value", 
    "key_b": { 
     "key_b_a": "value", 
     "key_b_b": { 
      "key_b_b_a": "value" 
     } 
    } 
} 

Was ich will, ist ein Verfahren zu schaffen, die gegebenen Schlüssel zu löschen oder ändern Sie seinen Wert.

def del_key(key): 
    my_dict = <dictionary described above> 
    keys = key.split(':') 
    if len(keys) == 1: 
     del my_dict[keys[0]] 
    elif len(keys) == 2: 
     del my_dict[keys[0]][keys[1]] 
    elif len(keys) == 3: 
     del my_dict[keys[0]][keys[1]][keys[2]] 
    . . . 

del_key('key_b:key_b_b:key_b_b_a') 
del_key('key_b:key_b_b') 
del_key('key_a') 

Wie kann ich das anmutig machen?

+0

Was ist falsch mit dem aktuellen 'del' Befehl? Scheint, als ob es schon tut, was Ihre Methode gerade mit etwas anderer Syntax tut. – James

+0

Wörterbuchstruktur kann sich unterscheiden und es kann eine beliebige Anzahl von gestapelten Wörterbüchern haben. if-else ist eine ziemlich hässliche Lösung, um einen Schlüssel in, sagen wir, 10. Sublevel –

Antwort

4

Es wird davon ausgegangen, dass Ihre Eingabe gültiger Schlüssel ist, andernfalls müssen Sie überprüfen.

data = { 
    "key_a": "value", 
    "key_b": { 
     "key_b_a": "value", 
     "key_b_b": { 
      "key_b_b_a": "value" 
     } 
    } 
} 

def del_key(key): 
    key = key.split(':') 
    temp = data 
    for i in key[:-1]: 
     temp = temp[i] 
    del temp[key[-1]] 
    return data 

print del_key('key_b:key_b_b:key_b_b_a') 
print del_key('key_b:key_b_b') 
print del_key('key_a') 

output: 
{'key_a': 'value', 'key_b': {'key_b_a': 'value', 'key_b_b': {}}} 
{'key_a': 'value', 'key_b': {'key_b_a': 'value'}} 
{'key_b': {'key_b_a': 'value'}} 
+0

zu löschen. Wunderbar! Danke vielmals! –

+0

@AlexanderZhak :) kein Problem – galaxyan

+0

Mit 'data' als Funktionsparameter und Überprüfung der Existenz der Schlüssel wäre dies eine wunderbare Antwort :) (derzeit ist auch gut, aber es gibt immer etwas zu zwicken: P) –