Ich habe ein Wörterbuch mit Wörterbüchern, wobei jedes verschachtelte Wörterbuch genau die gleichen Schlüssel hat, wie folgt:
%Vor% Wie erhalte ich eine Liste (oder ein Wörterbuch) aller Wörterbücher, in denen 'city'
den Wert 'bar'
hat?
Der folgende Code funktioniert, ist aber nicht skalierbar:
%Vor% Sagt 'city'
kann 50.000 eindeutige Werte haben und das Wörterbuch all_dicts
enthält 600.000 Werte, die Iteration über das Wörterbuch für jeden einzelnen Wert von 'city'
ist nicht sehr effizient.
Gibt es eine skalierbare und effiziente Möglichkeit, dies zu tun?
Was Sie tun könnten, ist einen Index für dieses Wörterbuch wie folgt zu erstellen:
%Vor% Dies erfordert einige Verarbeitungszeiten sowie zusätzlichen Speicher, aber danach ist es sehr schnell. Wenn Sie alle Elemente mit cityName
haben möchten, erhalten Sie sie folgendermaßen:
Das bringt viele Vorteile, wenn all_dicts
einmal erstellt und danach mehrfach abgefragt wird.
Wenn all_dicts
während der Ausführung Ihres Programms geändert wird, benötigen Sie etwas mehr Code, um cityIndex
zu verwalten. Wenn ein item
zu all_dicts
hinzugefügt wird, tun Sie einfach:
Wenn ein Element entfernt wird, ist dies eine einfache Möglichkeit, es aus dem Index zu entfernen (vorausgesetzt, die Kombination aus "name" und "city" ist einzigartig unter Ihren Elementen):
%Vor%Wenn es viel mehr Abfragen als Updates gibt, erhalten Sie immer noch eine enorme Leistungsverbesserung.
Sie müssen alle Werte überprüfen; Es gibt keine Alternative dazu. Sie könnten jedoch einen vektorisierten Ansatz verwenden - Listenverständnis - was viel schneller ist als eine for-Schleife:
%Vor% Die Verwendung von dict.values
anstelle des Zugriffs auf die Wörterbuchschlüssel verbessert auch die Leistung und ist auch in Python 3 speichereffizient.
Oder verwenden Sie filter
, in Python 3:
Oder mit pandas
:
Tags und Links python dictionary