Wie beschränken Sie die Größe von einem Wörterbuch?
Ich würde gerne mit ein dict in python, aber begrenzen die Anzahl der Schlüssel/Wert-Paare zu X. In anderen Worten, wenn die dict-ist derzeit die Speicherung von X Schlüssel/Wert-Paaren und ich führen eine insertion, möchte ich einen der vorhandenen Paare gelöscht werden. Es wäre schön, wenn es wurde vor kurzem die wenigsten eingefügt/greift auf die Taste, aber das ist nicht wirklich notwendig.
Falls vorhanden in der standard-Bibliothek bitte erspart mir einige Zeit und richten Sie es aus!
- duplizieren: stackoverflow.com/questions/1756992/...
- gute zu finden. ich möchte, um diese herum aber da ich nicht speziell lru.
- Die Begrenzung der Größe scheint genug von einer Unterscheidung zu einer anderen Frage, aber ja, die Frage ist die Hälfte dieses.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python 2.7 und 3.1 haben OrderedDict und es gibt pure-Python-Implementierungen für frühere Pythons.
Würden Sie auch überschreiben müssen andere Methoden, die Elemente einfügen, wie
update
. Der primäre nutzen vonOrderedDict
ist, so dass Sie kontrollieren können, was bekommt knallte leicht, ansonsten eine normaledict
funktionieren würde.(self, *args, size_limit=None, **kwds)
) sind nicht in der aktuellen 2.x. (Werden Sie als für 2.7? Unabhängig sind Sie nicht 2.6.) Dieser code funktioniert mit fast jeder version der OP ist wahrscheinlich zu verwenden, macht size_limit effektiv ein Schlüsselwort-parameter nur, und hält die gleiche Schnittstelle wie dicts.dict.pop
erfordert mindestens 1 argument.dict.popitem()
funktioniert, aber es entfernt das aktuelle Element.__contains__
- Methode verschieben Sie den letzten Punkt "verwendet" oder abgefragt, um die Spitze der dict-Link-Liste. [Ich verstehen, obwohl das nicht das Hauptziel ist die Frage]cachetools bieten Ihnen schöne Umsetzung der Zuordnung des Hashes, die diese (und es funktioniert auf python 2 und 3).
Auszug aus der Dokumentation:
Hier ist eine einfache, no-LRU-Python 2.6+ - Lösung (in älteren Pythons, die Sie tun könnten, etwas ähnliches mit
UserDict.DictMixin
, aber in 2.6 und besser, es wird nicht empfohlen, und das ABC voncollections
vorzuziehen sind sowieso...):Anderen Antworten erwähnt, werden Sie wahrscheinlich nicht wollen, um eine Unterklasse dict -- die explizite delegation
self.d
ist leider boilerplatey aber es hat Garantie, dass jede andere Methode ist ordnungsgemäß geliefertcollections.MutableMapping
.Hier ist eine einfache und effiziente LRU-cache geschrieben, mit Schmutz einfache Python-code läuft auf jedem python-version 1.5.2 oder höher:
OrderedDict
undMutableMapping
dies zu tun...PREV
,NEXT
,KEY
, undVALUE
da Sie nicht in einer der Methoden?Einen dict-nicht dieses Verhalten haben. Sie machen Ihre eigene Klasse, der dies tut, zum Beispiel etwas wie
Ein paar Hinweise zu diesem
dict
hier. Sie kann technisch, aber es ist Fehler-anfällig, weil die Methoden nicht voneinander abhängen. Sie könnenUserDict.DictMixin
zu speichern, zu definieren, alle Methoden. Es gibt nur wenige Methoden, die Sie wäre in der Lage, wieder zu verwenden, wenn Sie eine Unterklassedict
.collections.OrderedDict
, aber für jetzt, halten Sie die Tasten, um separat funktionieren soll (verwenden Sie einecollections.deque
als Warteschlange).popitem
Methode zum löschen eines beliebigen Elements.dict
Unterklassen in der wildnis, die coder vergessen zu überschreiben die entsprechenden Methoden. Dies bedeutet, dass Fehler, die sich aus dieser die Möglichkeit haben, übergeben Sie still, das ist wirklich schlecht. Ich sehe wirklich nicht viel zu sein gewonnen von Unterklassen in einem Fall wie diesem.__delitem__
wie indel d[key]
. Hinweis: dies O(n) Suche wirklich egal, wenn er will verwenden LRU statt der LR-Hinzugefügt.Können Sie erstellen ein benutzerdefiniertes Wörterbuch, indem bilden von Unterklassen der Klasse dict. In Ihrem Fall, müssten Sie überschreiben
__setitem__
haben, überprüfen Sie Ihre eigenen Länge und etwas löschen, wenn das limit ist recahed. Das folgende Beispiel druckt die aktuelle Länge nach jedem einfügen:dict
ist oft fruchtlos. In normalen Umständen mit Unterklassen, Methoden wieupdate
undsetdefault
verlassen würde, auf der overrided__getitem__
, aber das ist nicht, wie es hier funktioniert. Unterklassen gelieferten lässt es sich leicht einführen, schwierig-zu-sehen-bugs. Wenn Sie beseitigen solche Fehler, die Sie wirklich nicht gespeichert habe jede Arbeit, die von Unterklassen.Es gab viele gute Antworten, aber ich möchte darauf hinweisen, eine einfache, pythonic Umsetzung für die LRU-cache. Es ist ähnlich wie Alex Martelli ' s Antwort.