2017-05-23 6 views
-2

Ich habe ein Wörterbuch wie:Wie erstelle ich ein Wörterbuch aus Schichten eines verschachtelten Wörterbuchs?

dictionary = { 
    "key1" : 
     { 
     "key11" : ["a", "b"], 
     "key12" : "c" 
     }, 
    "key2": "d", 
    "key3": 
     { 
     "key31" : ["e", "f"], 
     "key32" : "g" 
     } 
} 

, und ich möchte ein anderes Wörterbuch erstellen, mit Teilen des ersten Wörterbuch. Ziel ist es, dem Benutzer meines Skripts zu ermöglichen, die Schlüssel, die er aus der alten Datei extrahieren möchte, an die neue Datei zu übergeben. Ich würde das neue Wörterbuch mag wie geformt zum Beispiel werden:

dictionary_bis = { 
    "key1" : 
     { 
      "key11" : ["a", "b"] 
     }, 
    "key3" : 
     { 
      "key32": "g" 
     } 
} 

, was ich jetzt habe, ist so etwas wie:

dictionary_1 = {} 
dictionary_1["key1"] = {} 
dictionary_1["key1"]["key11"] = dictionary["key1"["key11"] 
dictionary_1["key3"] = {} 
dictionary_1["key3"]["key32"] = dictionary["key3"]["key32"] 

, die wie eine schlechte Art und Weise scheint, denn jedes Mal, wenn der Benutzerschlüssel ändert er möchte extrahiert, ich muss es wieder hart codieren. Es muss einen eleganteren Weg geben, das zu tun.

bearbeiten

Zur Klarstellung: Ich habe ein großes Dokument in einer Sammlung in mongodb und den Anwender meiner Software ein neues Dokument zu erstellen, mit einigen Daten aus dem ersten Dokument in der Lage sein wollen, und speichern Sie es in eine andere Sammlung. Das ist, was mir eingefallen ist. Es kann eine Kopie einiger Elemente von einem Wörterbuch zum anderen sein, wenn Sie bitte.

+7

gut .... gibt es eine Logik, die hinter Ihrer Auswahl? Denn wenn nicht, könntest du es auch in * –

+0

eingeben, warum denkst du, dass es ein schlechter Weg ist? – Paddy

Antwort

1

Sie können es mit einem dict Verständnis tun:

keys_to_keep = ("key1", "key3") 
new_dict = {k:v for k, v in old_dict.items() if k in keys_to_keep} 

Wenn Sie sicher davon ausgehen kann, dass die Schlüssel nie wiederholen, und dass es nur eine 2-Ebene nisten, können Sie versuchen:

keys_to_keep = ("key1", "key12", "key3", "key32") 
new_dict = {} 


for k, v in dictionary.items(): 

    if k not in keys_to_keep: 
     continue 

    if isinstance(v, dict): 
     d = {subk: subv for subk, subv in v.items() if subk in keys_to_keep} 
     new_dict[k] = d 
    else: 
     new_dict[k] = v 

Hinweis: Um Kopien und nicht Verweise auf das Original-Diktat zu verarbeiten, können Sie entweder eine Kopie erstellen, indem Sie dictionary = old_dict.copy() anrufen, oder deep copying mit dem Modul copy.

Für beliebigen verschachtelten Wörterbücher:

from copy import deepcopy 

def prunedict(old_dict, keys_to_keep, copy=False): 

    new_dict = {} 

    if copy: 
     old_dict = deepcopy(old_dict) 

    for k, v in old_dict.items(): 

     if k not in keys_to_keep: 
      continue 

     if isinstance(v, dict): 
      d = prunedict(v, keys_to_keep, copy=False) 
      # if d == {}: continue ## In case you don't want empty entries. 
      new_dict[k] = d 
     else: 
      new_dict[k] = v 

    return new_dict 
+0

Gibt nicht die erwartete Ausgabe obwohl – kuro

+0

Richtig, er hat willkürlich verschachtelte dicts. Habe das nicht berücksichtigt. Ich werde sehen, was ich mit – dangom

+0

Beachten Sie auch, dass das Diktat einige veränderbare Werte hat. Vielleicht möchte OP eine Kopie. Ich beantworte diese Frage ehrlich nicht, bis das OP dies klarstellt. – timgeb

Verwandte Themen