Filterung Wörterbücher und die Schaffung von Unter Wörterbücher basierend auf Schlüssel / Werte in Python?

StackOverflow https://stackoverflow.com/questions/1214968

Frage

Ok, ich bin stecken, brauchen Hilfe von hier ...

Wenn ich habe ein Hauptwort-Buch wie dieses bekam:

data = [ {"key1": "value1", "key2": "value2", "key1": "value3"},  
{"key1": "value4", "key2": "value5", "key1": "value6"}, 
{"key1": "value1", "key2": "value8", "key1": "value9"} ]

Nun muss ich durch dieses Wörterbuch gehen schon einige der Daten zu formatieren, das heißt:

for datadict in data:  
    for key, value in datadict.items():  
    ...filter the data...

Nun, wie würde ich in derselben Schleife irgendwie (wenn möglich ... wenn nicht, Alternativen vorschlagen bitte) eine Überprüfung auf Werte bestimmter Tasten, und wenn diese Werte meine Vorgaben entsprechen dann würde ich die ganze Liste an ein anderes Wörterbuch hinzufügen und so effektiv kleinere Wörterbücher erstellen, wie ich dieses Haupt Wörterbuch basiert auf bestimmten Schlüssel und Werte gehen zusammen aus?

Also, lassen Sie uns sagen, dass ich ein Unter Wörterbuch mit allen Listen erstellen möchten, in dem Schlüssel1 Wert von „Wert1“ hat, die für die oben aufgeführte Liste würde mir so etwas wie folgt aus:

subdata = [ {"key1": "value1", "key2": "value2", "key1": "value3"},  
{"key1": "value1", "key2": "value8", "key1": "value9"} ]
War es hilfreich?

Lösung

Hier ist ein nicht so recht, wie es zu tun. Das Ergebnis ist ein Generator, aber wenn Sie wirklich eine Liste mögen, können Sie es mit einem Anruf umgeben list(). es spielt meist keine Rolle.

Das Prädikat ist eine Funktion, die in der Liste, wenn ein Wörterbuch für jeden Schlüssel / Wert-Paar entscheidet geht es zu schneiden. Der Standard man akzeptiert alle. Wenn kein k / v-Paar im Wörterbuch entspricht es abgelehnt wird.

def filter_data(data, predicate=lambda k, v: True):
    for d in data:
         for k, v in d.items():
               if predicate(k, v):
                    yield d


test_data = [{"key1":"value1", "key2":"value2"}, {"key1":"blabla"}, {"key1":"value1", "eh":"uh"}]
list(filter_data(test_data, lambda k, v: k == "key1" and v == "value1"))
# [{'key2': 'value2', 'key1': 'value1'}, {'key1': 'value1', 'eh': 'uh'}]

Andere Tipps

Net der Probleme bereits in anderen Kommentaren und Antworten (mehrere identische Schlüssel kann nicht in einem dict sein, etc etc) wies darauf hin, hier ist, wie ich es tun würde:

def select_sublist(list_of_dicts, **kwargs):
    return [d for d in list_of_dicts 
            if all(d.get(k)==kwargs[k] for k in kwargs)]

subdata = select_sublist(data, key1='value1')

Die Antwort ist zu einfach, so dass ich denke, wir einige Informationen fehlen. Wie dem auch sei:

result = []
for datadict in data:
    for key, value in datadict.items():
        thefiltering()

    if datadict.get('matchkey') == 'matchvalue':
        result.append(datadict)

Auch Sie „Hauptwörterbuch“ ist kein Wörterbuch, sondern eine Liste. Ich wollte nur, dass klären.

durch die Antwort von Skurmedal inspiriert, ich teilte diese in ein rekursive Schema mit einer Datenbank von verschachtelten Wörterbücher zu arbeiten. In diesem Fall wird ein „Rekord“ ist der subdictionary am Stamm. Das Prädikat definiert, welche Datensätze sind wir nach -. Diejenigen, die einige (Schlüssel, Wert) -Paar entsprechen, wo diese Paare können tief verschachtelt sein

def filter_dict(the_dict, predicate=lambda k, v: True):
    for k, v in the_dict.iteritems():
        if isinstance(v, dict) and _filter_dict_sub(predicate, v):
            yield k, v

def _filter_dict_sub(predicate, the_dict):
    for k, v in the_dict.iteritems():
        if isinstance(v, dict) and filter_dict_sub(predicate, v):
            return True
        if predicate(k, v):
            return True
    return False

Da dies ein Generator ist, können Sie mit dict(filter_dict(the_dict)) wickeln müssen ein gefiltertes Wörterbuch zu erhalten.

Es ist eine alte Frage, aber aus irgendeinem Grund gibt es keine Einzeiler Syntax Antwort:

{ k: v for k, v in <SOURCE_DICTIONARY>.iteritems() if <CONDITION> }

Zum Beispiel:

src_dict = { 1: 'a', 2: 'b', 3: 'c', 4: 'd' }
predicate = lambda k, v: k % 2 == 0
filtered_dict = { k: v for k, v in src_dict.iteritems() if predicate(k, v) }

print "Source dictionary:", src_dict
print "Filtered dictionary:", filtered_dict

Wird die folgende Ausgabe:

Source dictionary: {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
Filtered dictionary: {2: 'b', 4: 'd'}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top