Python-Liste von Wörterbüchern suchen
Nehme ich diese:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
und mit der Suche nach "Pam" als name, ich will zum abrufen der zugehörigen dictionary: {name: "Pam", age: 7}
Wie Sie diese erreichen ?
InformationsquelleAutor Hellnar | 2011-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eine generator-Ausdruck:
das ist noch eine Liste Verständnis, es wird also die Iteration über den gesamten Eingabe-Sequenz unabhängig von der position des übereinstimmenden Elements.
Ich persönlich würde anwenden
upper()
zu beiden Zeichenketten vor dem Vergleich, obwohl natürlich gibt es viele andere Möglichkeiten, es zu tun.Dies raise stopiteration Fehler, wenn key nicht im Wörterbuch
dann fügen Sie
enumerate()
zu erzeugen, einen Lauf-index:next(i for i, item in enumerate(dicts) if item["name"] == "Pam")
.InformationsquelleAutor Frédéric Hamidi
Sieht für mich am meisten pythonic way:
Ergebnis (Rückgabe als Liste in Python 2):
Hinweis: In Python 3, ein filter-Objekt wird zurückgegeben. Also die Python ist3 Lösung wäre:
Erwähnenswert ist auch, dass das Ergebnis ist ein filter-Objekt, nicht eine Liste - wenn Sie möchten, verwenden Sie Dinge wie
len()
, müssen Sie rufen Sielist()
auf das erste Ergebnis. Oder: stackoverflow.com/questions/19182188/...dies ist, was mein Python 2.7 sagt: Menschen = [ {'name': "Tom", "Alter": 10}, {"name": "Mark", "Alter": 5}, {"name": "Pam", "Alter": 7} ] r = filter(lambda person: person['name'] == 'Pam', Menschen) Typ(r) Liste, So dass
r
ist einlist
meine schlecht, ich habe nur die Funktion, die in Python 3. Haben vorgeschlagen, ein Bearbeiten, dass das Ergebnis spezifisch für Python 2.
InformationsquelleAutor PaoloC
@Frédéric Hamidi ' s Antwort ist Super. In Python 3.x die syntax für
.next()
leicht verändert. So eine leichte Modifikation:Wie bereits erwähnt in den Kommentaren von @Matt, Sie können einen Standardwert als Z:
InformationsquelleAutor Mike N
Können Sie eine list comprehension:
InformationsquelleAutor
Nur, um diese sehr nützliche routine ein wenig mehr Generika:
def search(list, key, value): for item in list: if item[key] == value: return item
InformationsquelleAutor satoru
Getestet habe ich verschiedene Methoden an, gehen Sie durch eine Liste von Wörterbüchern und Rückkehr der Wörterbücher, wo Schlüssel x hat einen bestimmten Wert.
Ergebnisse:
Alle tests gemacht mit Python 3.6.4, W7x64.
Ergebnisse:
Funktion Name-Inclusive-Zeit % Exklusive Zeit % Avg-Inclusive-Zeit Avg Exklusive Zeit searchTime.d 0.85 0.46 0.23 0.13 searchTime.eine 0.33 0.33 0.09 0.09 searchTime.b 0.28 0.05 0.08 0.01 searchTime.c 0.2 0.02 0.05 0.01 searchTime.z 0.02 0.01 0.01 0
InformationsquelleAutor user136036
Hinzufügen nur ein kleines bisschen zu @FrédéricHamidi.
Falls Sie nicht sicher sind, wird ein Schlüssel in der Liste von dicts, so etwas wie dieses helfen würde:
InformationsquelleAutor Drazen Urch
Haben Sie jemals versucht, aus der pandas-Paket? Es ist perfekt für diese Art von Suche Aufgabe und optimiert zu werden.
Ich habe ein bisschen benchmarking unten, um zu veranschaulichen, pandas' schnellere Laufzeiten auf einem größeren Maßstab, d.h. 100k Einträge:
InformationsquelleAutor abby sobh
Dies ist eine Allgemeine Art und Weise der Suche einen Wert in einer Liste von dictionaries:
InformationsquelleAutor ipegasus
Dies ist ein Weg...
Sicher. Das ist der richtige Weg, es zu tun.
InformationsquelleAutor Niclas Nilsson
Mein Erster Gedanke wäre, dass Sie vielleicht möchten Sie erwägen, ein Wörterbuch dieser Wörterbücher ... wenn, zum Beispiel, dass Sie gehen, um zu suchen, die es mehr als ein kleine Anzahl von Zeiten.
Jedoch, dass möglicherweise eine vorzeitige Optimierung. Was wäre falsch mit:
behauptet kann übersprungen werden, wenn debug Modus ausgeschaltet ist.
InformationsquelleAutor Jim Dennis
InformationsquelleAutor robert king
Einfach mit list comprehension:
Beispielcode:
InformationsquelleAutor Teoretic
Müssen Sie gehen Sie durch alle Elemente der Liste. Es ist nicht eine Abkürzung!
Es sei denn, woanders halten Sie ein Wörterbuch der Namen verweist auf die Elemente der Liste, aber dann müssen Sie kümmern sich um die Folgen platzender ein element aus Ihrer Liste.
siehe die Antwort von @user334856
vielleicht war ich nicht klar in meiner Aussage. Durch die Verwendung einer list-comprehension user334856 Antwort stackoverflow.com/a/8653572/512225 geht durch die ganze Liste. Dies bestätigt meine Aussage. Die Antwort, die Sie finden ist ein weiterer Weg, zu sagen, was ich schrieb.
InformationsquelleAutor jimifiki
Hier ist ein Vergleich mit der Iteration throuhg Liste mit filter+lambda-oder Umgestaltung(falls erforderlich oder gilt, um Ihren Fall) den code dict von dicts eher als Liste von dicts
Und die Ausgabe ist:
Fazit:
Offensichtlich mit einem Wörterbuch von dicts ist der effizienteste Weg, um in der Lage sein zu suchen, in jenen Fällen, wo Sie wissen, sagen, Sie werden auf der Suche nach id ' s nur.
interessanterweise mit filter ist der langsamste Lösung.
InformationsquelleAutor Kőhalmy Zoltán
Ich diesen thread gefunden als ich auf der Suche nach einer Antwort auf dieselbe
Frage. Während ich erkennen, dass es eine späte Antwort, ich dachte, ich würde
tragen Sie in Fall ist es sinnvoll, für alle anderen:
InformationsquelleAutor Doug R.
Können Sie versuchen, diese:
InformationsquelleAutor Siddharth Satpathy
Ich denke, dass Sie verwenden können, Pandas, um sich mit diesem.
It-Ausgänge:
Die Vorteile sind:
InformationsquelleAutor lazy_frog