Es gibt eine vorhandene Funktion, die wie folgt endet d
: Ein Wörterbuch:
return d.iteritems()
Das gibt einen unsortierten Iterator für ein bestimmtes Wörterbuch zurück. Ich möchte einen Iterator zurückgeben, der die nach Schlüssel sortierten Elemente durchläuft . Wie mache ich das?
python
sorting
dictionary
Mike
quelle
quelle
.items()
anstelle voniteritems()
: Wie @Claudiu sagte, funktionieren Iteritems nicht für Python 3.x, sind jedochitems()
in Python 2.6 verfügbar.items()
wird eine Liste erstellt und daher Speicher verwendet, während imiteritems()
Wesentlichen kein Speicher verwendet wird. Was zu verwenden ist, hängt hauptsächlich von der Größe des Wörterbuchs ab. Darüber hinaus2to3
übernimmt das automatische Konvertierungstool Python 2 in Python 3 ( ) automatisch die Konvertierung voniteritems()
nachitems()
, sodass Sie sich darüber keine Gedanken machen müssen.collections.OrderedDict
dann sortieren Sie einmal und erhalten Artikel immer in sortierter Reihenfolge.iteritems()
kein Speicher verwendet wird, muss alles in den Speicher gezogen werdensorted()
, damit es keinen Unterschied zwischen der Verwendung vonitems()
unditeritems()
hier in Bezug auf den Speicher gibt .items()
items()
iteritems()
Verwenden Sie die
sorted()
Funktion:Wenn Sie einen tatsächlichen Iterator über die sortierten Ergebnisse wünschen, da
sorted()
eine Liste zurückgegeben wird, verwenden Sie:quelle
Die Schlüssel eines Diktats werden in einer Hashtabelle gespeichert, so dass dies ihre "natürliche Reihenfolge" ist, dh pseudozufällig. Jede andere Bestellung ist ein Konzept des Verbrauchers des Diktats.
sorted () gibt immer eine Liste zurück, kein Diktat. Wenn Sie ein dict.items () übergeben (das eine Liste von Tupeln erzeugt), wird eine Liste von Tupeln [(k1, v1), (k2, v2), ...] zurückgegeben, die in einer Schleife verwendet werden können in gewisser Weise wie ein Diktat, aber es ist sowieso kein Diktat !
Das Folgende fühlt sich wie ein Diktat in einer Schleife an, ist es aber nicht, es ist eine Liste von Tupeln, die in k, v entpackt werden:
Ungefähr gleichbedeutend mit:
quelle
sorted(foo.keys())
ist besser als das Äquivalentsorted(foo)
, da Wörterbücher ihre Schlüssel zurückgeben, wenn sie wiederholt werden (mit dem Vorteilfoo.keys()
, dass sie möglicherweise nicht gezwungen werden, die Zwischenliste zu erstellen - je nachdem, wiesorted()
sie für iterable implementiert werden).k in sorted(foo.keys()):
for k,v in sorted(foo.items()):
sorted(foo.keys())
Gregs Antwort ist richtig. Beachten Sie, dass Sie dies in Python 3.0 tun müssen
wie
iteritems
wird weg sein.quelle
Sie können jetzt auch
OrderedDict
in Python 2.7 verwenden:Hier haben Sie die neue Seite für die Version 2.7 und die OrderedDict-API .
quelle
Im Allgemeinen kann man ein Diktat so sortieren:
Fügen Sie für den speziellen Fall in der Frage mit einem "Drop-in-Replacement" für d.iteritems () eine Funktion wie die folgende hinzu:
und so ändert sich die Endzeile von
zu
oder
quelle
Diese Methode hat immer noch eine O (N log N) -Sortierung. Nach einem kurzen linearen Heapify werden die Elemente jedoch in sortierter Reihenfolge ausgegeben, was sie theoretisch effizienter macht, wenn Sie nicht immer die gesamte Liste benötigen.
quelle
Wenn Sie nach der Reihenfolge sortieren möchten, in der Elemente anstelle der Reihenfolge der Schlüssel eingefügt wurden, sollten Sie einen Blick auf Pythons Sammlungen werfen. OrderedDict . (Nur Python 3)
quelle
sortiert gibt eine Liste zurück, daher Ihr Fehler, wenn Sie versuchen, darüber zu iterieren. Da Sie jedoch kein Diktat bestellen können, müssen Sie sich mit einer Liste befassen.
Ich habe keine Ahnung, was der größere Kontext Ihres Codes ist, aber Sie könnten versuchen, der resultierenden Liste einen Iterator hinzuzufügen. so vielleicht?:
Natürlich werden Sie jetzt Tupel zurückbekommen, weil sortiert Ihr Diktat in eine Liste von Tupeln verwandelt hat
Beispiel: Sagen Sie, Ihr Diktat war:
{'a':1,'c':3,'b':2}
Sortiert verwandelt es in eine Liste:Wenn Sie also tatsächlich über die Liste iterieren, erhalten Sie (in diesem Beispiel) ein Tupel zurück, das aus einer Zeichenfolge und einer Ganzzahl besteht, aber zumindest können Sie darüber iterieren.
quelle
Angenommen, Sie verwenden CPython 2.x und haben ein großes Wörterbuch mydict, dann wird die Verwendung von sortiert (mydict) langsam sein, da sortiert eine sortierte Liste der Schlüssel von mydict erstellt.
In diesem Fall sollten Sie sich mein bestelltes Dikt-Paket ansehen, das eine C-Implementierung von enthält
sorteddict
in C enthält. Insbesondere, wenn Sie die sortierte Liste der Schlüssel in verschiedenen Phasen (dh Anzahl der Elemente) der Lebensdauer der Wörterbücher mehrmals durchgehen müssen.http://anthon.home.xs4all.nl/Python/ordereddict/
quelle