Angenommen, ich habe Folgendes:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
und indem ich "Pam" als Namen suche, möchte ich das zugehörige Wörterbuch abrufen: {name: "Pam", age: 7}
Wie erreicht man das?
python
search
dictionary
Hellnar
quelle
quelle
[item for item in dicts if item["name"] == "Pam"][0]
?enumerate()
, um einen laufenden Index zu generieren :next(i for i, item in enumerate(dicts) if item["name"] == "Pam")
.Das sieht für mich am pythonischsten aus:
Ergebnis (in Python 2 als Liste zurückgegeben):
Hinweis: In Python 3 wird ein Filterobjekt zurückgegeben. Die Python3-Lösung wäre also:
quelle
len()
, müssen Sielist()
zuerst das Ergebnis aufrufen . Oder: stackoverflow.com/questions/19182188/…r
ist einlist
next(filter(lambda x: x['name'] == 'Pam', dicts))
@ Frédéric Hamidis Antwort ist großartig. In Python 3.x hat sich die Syntax für
.next()
leicht geändert. Also eine kleine Modifikation:Wie in den Kommentaren von @Matt erwähnt, können Sie einen Standardwert als solchen hinzufügen:
quelle
Sie können ein Listenverständnis verwenden :
quelle
quelle
def search(list, key, value): for item in list: if item[key] == value: return item
Ich habe verschiedene Methoden getestet, um eine Liste von Wörterbüchern durchzugehen und die Wörterbücher zurückzugeben, in denen Schlüssel x einen bestimmten Wert hat.
Ergebnisse:
Alle Tests wurden mit Python 3.6 .4, W7x64 durchgeführt.
Ergebnisse:
quelle
Um @ FrédéricHamidi nur ein kleines bisschen hinzuzufügen.
Falls Sie nicht sicher sind, ob ein Schlüssel in der Liste der Diktate enthalten ist, hilft Folgendes:
quelle
item.get("name") == "Pam"
Haben Sie jemals das Pandas-Paket ausprobiert? Es ist perfekt für diese Art von Suchaufgabe und auch optimiert.
Ich habe unten ein wenig Benchmarking hinzugefügt, um die schnelleren Laufzeiten der Pandas in größerem Maßstab zu veranschaulichen, dh mehr als 100.000 Einträge:
quelle
Dies ist eine allgemeine Methode zum Suchen eines Werts in einer Liste von Wörterbüchern:
quelle
Dies ist eine Möglichkeit ...
quelle
Einfach Listenverständnis verwenden:
Beispielcode:
quelle
Sie können dies mit der Verwendung von Filter und nächsten Methoden in Python erreichen.
filter
Methode filtert die angegebene Sequenz und gibt einen Iterator zurück.next
Die Methode akzeptiert einen Iterator und gibt das nächste Element in der Liste zurück.So können Sie das Element finden durch,
und die Ausgabe ist,
Hinweis: Der obige Code wird zurückgegeben,
None
falls der gesuchte Name nicht gefunden wird.quelle
Mein erster Gedanke wäre, dass Sie vielleicht ein Wörterbuch dieser Wörterbücher erstellen möchten ... wenn Sie es beispielsweise mehr als selten durchsuchen würden.
Dies könnte jedoch eine vorzeitige Optimierung sein. Was wäre falsch daran:
quelle
quelle
Ein einfacher Weg, Listenverständnisse zu verwenden, ist, ob
l
es sich um die Liste handeltdann
quelle
Sie können dies versuchen:
quelle
Hier ist ein Vergleich mit iterierender Throuhg-Liste, Filter + Lambda oder Refactoring (falls erforderlich oder für Ihren Fall gültig) Ihres Codes, um Diktate anstelle von Diktaten zu diktieren
Und die Ausgabe ist folgende:
Fazit: Ein Wörterbuch mit Diktaten ist eindeutig die effizienteste Methode, um in den Fällen suchen zu können, in denen Sie wissen, dass Sie nur nach IDs suchen. Interessanterweise ist die Verwendung von Filtern die langsamste Lösung.
quelle
Sie müssen alle Elemente der Liste durchgehen. Es gibt keine Abkürzung!
Sofern Sie nicht irgendwo anders ein Wörterbuch mit den Namen führen, die auf die Elemente der Liste verweisen, müssen Sie sich dann um die Konsequenzen kümmern, wenn Sie ein Element aus Ihrer Liste entfernen.
quelle
Ich habe diesen Thread gefunden, als ich nach einer Antwort auf dieselbe Frage gesucht habe. Obwohl mir klar ist, dass es eine späte Antwort ist, dachte ich, ich würde sie beitragen, falls es für andere nützlich ist:
quelle
Die meisten (wenn nicht alle) hier vorgeschlagenen Implementierungen weisen zwei Mängel auf:
Ein aktualisierter Vorschlag:
Vielleicht nicht die pythonischste, aber zumindest ein bisschen ausfallsicherer.
Verwendungszweck:
Das Wesentliche .
quelle