python: wie man eine Teilmenge von dict

7

Ich habe ein dict, das viele Elemente hat, ich möchte eine Funktion schreiben, die die Elemente im angegebenen Indexbereich zurückgeben kann (Behandle dict als Array):

%Vor%

Wie kann das gemacht werden?

BEARBEITEN: Ich frage nicht mit Schlüsselfilter ... zB)

%Vor%

Es ist mir egal, die Sortierung ... Eigentlich implementiere ich das Server-Side-Paging ...

    
Bin Chen 16.11.2010, 13:00
quelle

4 Antworten

16

Bearbeiten: Ein Wörterbuch ist nicht geordnet . Es ist unmöglich, get_range das gleiche Segment zurückzugeben, wenn Sie das Wörterbuch geändert haben. Wenn Sie ein deterministisches Ergebnis benötigen, ersetzen Sie Ihr dict durch collections.OrderedDict .

Wie auch immer, Sie könnten ein Stück mit itertools.islice erhalten:

%Vor%

Die vorherige Antwort, die nach Schlüssel gefiltert wird, bleibt unten:

Mit @ Douglas 'Algorithmus Wir könnten es vereinfachen, indem wir einen Generator-Ausdruck verwenden:

%Vor%

Übrigens, verwenden Sie nicht dict als Variablennamen, wie Sie hier sehen können dict ist ein Konstruktor des Wörterbuchs.

Wenn Sie Python 3.x verwenden, können Sie das Wörterbuchverständnis direkt verwenden.

%Vor%     
kennytm 16.11.2010, 13:05
quelle
3

Einfache Implementierung:

%Vor%

Eine Zeile:

%Vor%     
Douglas Leeder 16.11.2010 13:03
quelle
0

Wenn Sie sicher sind, dass Sie wirklich ein OrderedDict möchten, können Sie auch enumerate :

verwenden %Vor%

Ausgabe:

%Vor%

ps: Ich lasse Sie 0, 1 als Bereichswerte verwenden, aber Sie sollten 0, 2 verwenden, um die "ersten beiden Elemente" zu signieren (und begin <= i < end als Vergleichsfunktion verwenden

)     
Vito De Tullio 16.11.2010 16:18
quelle
0

Wie andere bereits erwähnt haben, sind Wörterbücher in Python inhärent ungeordnet. Sie können jedoch jederzeit eine Liste ihrer aktuellen Schlüssel oder Schlüsselpaare erhalten, indem Sie ihre Methoden keys() oder items() verwenden.

Ein potentielles Problem bei der Verwendung dieser Listen besteht darin, dass nicht nur ihr Inhalt, sondern auch die Reihenfolge, in der sie zurückgegeben wird, wahrscheinlich variieren wird, wenn das Wörterbuch seit der letzten Verwendung geändert (oder mutiert) wurde. Das bedeutet, dass Sie die Liste im Allgemeinen nicht speichern und wiederverwenden können, es sei denn, Sie aktualisieren sie jedes Mal, wenn das Wörterbuch geändert wird, nur für den Fall, dass Sie es brauchen.

Um diesen Ansatz handhabbarer zu machen, können Sie ein Dictionary und die Hilfsliste in eine neue abgeleitete Klasse kombinieren, die für die Synchronisation zwischen beiden sorgt und eine get_range() -Methode bereitstellt, die den aktuellen Inhalt der Liste verwendet. Unten ist ein Beispielcode, der zeigt, wie das gemacht werden könnte. Es basiert auf Ideen, die ich aus dem Code in diesem ActiveState Python-Rezept erhalten habe .

%Vor%

Die Grundidee besteht darin, eine neue Klasse von dict abzuleiten, die auch eine interne Inhaltsliste zur Verwendung durch die neue Methode get_range() hat, die reguläre Wörterbuchobjekte nicht bieten. Um die Notwendigkeit zu minimieren, diese interne Liste zu aktualisieren (oder sogar zu erstellen), weist sie auch ein Flag auf, das anzeigt, ob die Liste aktuell ist oder nicht, und prüft sie nur und baut die Liste bei Bedarf neu auf.

Um das Flag beizubehalten, wird jede geerbte Dictionary-Methode, die den Inhalt des Dictionary potentiell verändert (oder verändert), mit einer Helferfunktion "umgebrochen", setzt das Flag zurück und kettet dann an die normale Dictionary-Methode, um die Operation tatsächlich auszuführen. Um sie in die Klasse zu integrieren, müssen einfach die Namen der Methoden in eine von zwei Listen eingetragen und dann nach der Erstellung der Klasse sofort an ein Hilfsprogramm übergeben werden.

    
martineau 17.11.2010 00:08
quelle

Tags und Links