Python: Holen Sie sich die Werte (Objekte) aus einem Wörterbuch von Objekten, in denen man von dem Objekt, das Feld entspricht einem Wert (oder Bedingung)
Habe ich ein python-dictionary, dessen Schlüssel sind strings, und die Werte sind Objekte.
Beispielsweise ein Objekt mit einem string und einem int
class DictItem:
def __init__(self, field1, field2):
self.field1 = str(field1)
self.field2 = int(field2)
und das Wörterbuch:
myDict = dict()
myDict["sampleKey1"] = DictItem("test1", 1)
myDict["sampleKey2"] = DictItem("test2", 2)
myDict["sampleKey3"] = DictItem("test3", 3)
Welche ist die beste/effizienteste Weg, um die Wörterbuch-Einträge, die "Feld2" Feld >= 2?
Die Idee ist die Schaffung eines "sub-Lexikon" (eine Liste würde es auch tun) nur die Einträge, in denen Feld2 >= 2 (in dem Beispiel wäre wie):
{
"sampleKey2": {
"field1" : "test2",
"field2": 2
},
"sampleKey3": {
"field1" : "test3",
"field2": 3
}
}
Gibt es einen besseren Weg, als zu Fuß durch alle dictionary-Elemente, und überprüfen Sie den Zustand? Vielleicht mit itemgetters und lambda-Funktionen?
Danke!
P. S.: ich bin mit Python2.4, nur im Fall, dass es relevant ist,
Vielen Dank Euch allen!! Es war sehr nützliche Informationen 🙂
InformationsquelleAutor BorrajaX | 2010-03-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Machen
dict
von Ihremdict
,warum also nicht akzeptieren, die Antwort (mit dem Häkchen-Symbol in Form, unter der großen Zahl)? Das ist ALSO die grundlegende Etikette: danke schön, aber die Akzeptanz ist es, was zählt!
.. Ohhh... ich wusste nicht, wie das funktioniert hat! (Es war mein Erster post hier)
InformationsquelleAutor Alex Martelli
Dokumentation:
Liste-Verstehens,
iteritems()
"eine Liste würde es auch tun"
InformationsquelleAutor bernie
Halten, sollten Sie Ihre verschiedenen Datensätze - das ist "DicItem" Instanzen - in einer Liste.
Ein generator/Liste-Ausdruck kann dann filtern Sie Ihre gewünschten Ergebnisse mit Leichtigkeit.
dann:
Diese, natürlich, schafft ein linearer filter. Wenn Sie mehr als lineare Geschwindigkeit für einige Ihrer Fragen, die das container-Objekt für die Register - in diesem Fall eine "Liste" sollte eine spezialisierte Klasse in der Lage, erstellen Sie Indizes für die Daten, die dort, ähnlich wie bei einem DBMS mit seinen Tisch-Indizes. Diese kann getan werden, leicht ableiten einer Klasse von "Liste" und überschreiben der "
append", "insert", "__getitem__", "__delitem__"
und"pop"
Methoden.Wenn Sie diese für einen hohen Profil-Applikation, ich würde vorschlagen, Sie nehmen einen Blick auf einige der objektorientierte DB-Systeme für Python gibt, wie ZODB und andere.
InformationsquelleAutor jsbueno
Die Idee ist die Schaffung eines "sub-Lexikon" (eine Liste würde es auch tun)
Wenn Sie möchten, eine Liste, die Sie nutzen könnten filter (oder itertools.ifilter):
InformationsquelleAutor ChristopheD
'Effektivsten' ist, hängt davon ab, wie oft das Wörterbuch, ändert sich der Inhalt im Vergleich zu wie oft tun Sie die Suche.
Wenn das Wörterbuch Häufig ändert und Sie die lookup-weniger oft dann die effizienteste Methode sein wird, zu Fuß durch iteritems und der Auswahl der Objekte, die den Kriterien entsprechen, mit dem code, den Adam Bernier gepostet.
Wenn das Wörterbuch nicht viel ändern, und Sie tun viel lookups dann kann es schneller sein, eine oder mehrere inverse Wörterbücher, z.B. ein mapping der "Feld2" Werte zu einer Liste von Objekten, die, Wert.
Alternativ, wenn Sie sich zu tun, komplexe Abfragen, Sie könnten alle Daten in einer in-memory-sqllite Datenbank und lassen Sie SQL Sortieren Sie es aus, vielleicht über ein ORM wie SqlAlchemy
InformationsquelleAutor Dave Kirby