2017-01-23 3 views
2

Ich versuche, eine Reihe von Werten aus einem Python-Wörterbuch herauszufiltern. Basierend auf der Antwort hier gesehen: Filter dict to contain only certain keys. Ich tue so etwas wie:Herausfiltern von Python-Dictionary-Werten mit einem Array verschachtelter Schlüssel

new = {k:data[k] for k in FIELDS if k in data} 

Grundsätzlich erstellen Sie das new Wörterbuch und kümmern sich nur um die in der FIELDS Array aufgelistet Tasten. Mein Array sieht folgendermaßen aus:

FIELDS = ["timestamp", "unqiueID",etc...] 

Wie kann ich dies tun, wenn der Schlüssel verschachtelt ist? I.E. ['user']['color']?

Wie füge ich einen verschachtelten Schlüssel zu diesem Array hinzu? Ich habe versucht: [user][color], ['user']['color'], 'user]['color, und keiner von ihnen ist richtig :) Viele der Werte, die ich brauche, sind verschachtelte Felder. Wie kann ich einen verschachtelten Schlüssel zu diesem Array hinzufügen und immer noch das Bit new = {k:data[k] for k in FIELDS if k in data} arbeiten lassen?

+0

haben sie alle die gleiche "Tiefe" haben? –

+0

Nein einige sind nur eine tiefe und andere 2 oder 3 tief. @ WillemVanOnsem – HectorOfTroy407

+1

Beginnen Sie mit der Verflachung Ihres Wörterbuchs und Komprimieren der Tasten http://StackOverflow.com/Questions/6027558/Flatten-Nested-Python-Dictionaries-Compressing-Tasten. Wählen Sie dann die Schlüssel aus, die _enthalten_ eines der 'FIELDS' -Tags enthalten. – DyZ

Antwort

1

Ein ziemlich einfacher Ansatz, könnte wie folgt aussehen (es wird nicht für alle Möglichkeiten funktionieren - Objekte in Listen/Arrays). Sie müssen nur ein "Format" angeben, wie Sie nach verschachtelten Werten suchen möchten.

‚findvalue‘ wird die SearchKey aufgeteilt (hier auf Punkte) in dem gegebenen Objekt, gefunden, wenn es den nächsten ‚Unterschlüssel‘ in dem folgenden Wert sucht (vorausgesetzt, es ist ein dict/Objekt) ...

myObj = { 
    "foo": "bar", 
    "baz": { 
     "foo": { 
      "bar": True 
     } 
    } 
} 

def findValue(obj, searchKey): 
    keys = searchKey.split('.') 

    for i, subKey in enumerate(keys): 
     if subKey in obj: 
      if i == len(subKey) -1: 
       return obj[subKey] 
      else: 
       obj = obj[subKey] 
     else: 
      print("Key not found: %s (%s)" % (subKey, keys)) 
      return None 

res = findValue(myObj, 'foo') 
print(res) 

res = findValue(myObj, 'baz.foo.bar') 
print(res) 

res = findValue(myObj, 'cantFind') 
print(res) 

Returns:

bar 
True 
Key not found: cantFind (cantFind) 
None 
-1

Erstellen Sie eine rekursive Funktion, die überprüft, ob der Wörterbuchschlüssel Wert oder Wörterbuch hat. Wenn Schlüssel wieder Wörterbuch hat, rufen Sie die Funktion auf, bis Sie den Nicht-Wörterbuch-Wert gefunden haben. Wenn Sie Wert finden, fügen Sie es einfach zu Ihrem neu erstellten Wörterbuch hinzu.

Hoffe, das hilft.

+0

Was ist eine _nested-Funktion_? – DyZ

+0

Entschuldigung, es war rekursiv, nicht verschachtelt. Danke für die Korrektur –

Verwandte Themen