Wie Sortiere ich ein Wörterbuch von Wert?
Habe ich ein Wörterbuch der Werte aus zwei Feldern in einer Datenbank: ein string-Feld und ein numerisches Feld. Die string-Feld ist einzigartig, so dass der Schlüssel des dictionary.
Ich kann irgendwie auf den Tasten, aber wie kann ich die Sortierung basierend auf den Werten?
Hinweis: ich habe gelesen, Stack Overflow Frage hier Wie Sortiere ich eine Liste der Wörterbücher, indem Sie einen Wert aus dem dictionary? und wahrscheinlich könnte sich ändern mein code, um eine Liste der Wörterbücher, aber da ich nicht wirklich brauchen, eine Liste der Wörterbücher, die ich wollte wissen, ob es eine einfachere Lösung zu Sortieren, entweder in aufsteigender oder absteigender Reihenfolge.
"sorted()" kann arbeiten auf Wörterbücher (und liefert eine Liste von sortierten Schlüssel), so dass ich denke, er ist sich dessen bewusst. Ohne zu wissen, sein Programm, es ist absurd zu sagen, jemand Sie sind mit der falschen Datenstruktur. Wenn schnelle lookups sind, was Sie brauchen 90% der Zeit, dann ein dict ist wahrscheinlich das, was Sie wollen.
Alle drei Ausgänge (Schlüssel, Werte, beide) für die Sortierung Wörterbücher abgedeckt sind, hier in eine klare und prägnante Stil: stackoverflow.com/questions/16772071/sort-dict-by-value-python
Die Basisklasse kann nicht bestellt werden, aber OrderedDict ist natürlich.
In Python 3.6+ Wörterbücher bewahren, insertion um. Dies ist natürlich nicht das gleiche, wie die Möglichkeit der Sortierung nach Wert, aber auf der anderen Seite ist es nicht mehr gültig zu sagen, dass "dictionary-Datenstruktur nicht die Ordnung".
InformationsquelleAutor Gern Blanston | 2009-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht möglich zu Sortieren, ein Wörterbuch, nur um eine Darstellung Wörterbuch, das sortiert ist. Wörterbücher sind von Natur aus ungeordnet, aber andere Typen, wie Listen und Tupel, sind es nicht. Sie müssen also eine geordnete Datentyp darstellen sortierten Werte, die eine Liste, die wahrscheinlich eine Liste von Tupeln.
Beispielsweise
sorted_x
wird eine Liste von tuples sortiert, indem das zweite element in jedem Tupel.dict(sorted_x) == x
.Und für diejenigen, die Sortierung auf-Schlüsseln anstelle von Werten:
In Python ist3 da Auspacken ist nicht erlaubt [1] wir können
Wenn Sie möchten, dass die Ausgabe als dict, die Sie verwenden können,
Sammlungen.OrderedDict
:sorted_x.reverse()
geben Sie eine absteigende Sortierung (durch das zweite Tupel-element)saidimu: Da wir bereits mit
sorted()
sind, ist es viel effizienter, den pass in diereverse=True
argument.In Python ist3 habe ich eine lambda:
sorted(d.items(), key=lambda x: x[1])
. Funktioniert dies in python 2.x?OrderedDict Hinzugefügt Sammlungen in 2.7. Sortieren Beispiel gezeigt: docs.python.org/library/...
InformationsquelleAutor Devin Jeanpierre
Einfach:
sorted(dict1, key=dict1.get)
Gut, es ist wirklich möglich zu tun, eine "Art von Wörterbuch-Werten". Vor kurzem hatte ich das nicht in einem Code Golf (Stack Overflow Frage Code golf: Wort-Frequenz-Diagramm). Eine gekürzte, das problem war von der Art: in einem gegebenen text zu zählen, wie oft jedes Wort gefunden wird, und zeigt eine Liste der top-Wörter, sortiert nach Abnehmender Häufigkeit.
Wenn Sie konstruieren ein Wörterbuch mit den Wörtern, die als Schlüssel und die Anzahl der vorkommen jedes Wortes als Wert, vereinfacht hier als:
dann können Sie eine Liste der Wörter, geordnet nach der Häufigkeit der Benutzung mit
sorted(d, key=d.get)
- die Art durchläuft die Schlüssel für Wörterbücher, die Anzahl der mit einem Wort vorkommen, wie eine Art Schlüssel .Ich Schreibe diesen ausführlichen Erläuterung, um zu verdeutlichen, was die Menschen oft meinen, durch "ich kann einfach Art ein Wörterbuch von Schlüssel, aber wie Sortiere ich nach Wert" - und ich denke, die OP wurde versucht, um die Adresse so ein Problem. Und die Lösung ist zu tun, Sortieren der Liste mit den Tasten, auf der Grundlage der Werte, wie oben gezeigt.
key=operator.itemgetter(1)
sollte mehr skalierbar für Effizienz alskey=d.get
Sie müssen zuerst: - import-Sammlungen # zu verwenden defaultdict
Ich mache beobachten "funktioniert nicht" Verhalten mit itemgetter: -----
from operator import itemgetter d = {"a":7, "b":1, "c":5, "d":3} sorted_keys = sorted(d, key=itemgetter, reverse=True) for key in sorted_keys: print "%s: %d" % (key, d[key])
----- -> b: 1 c: 5 a: 7 d: 3 Die Ergebnisse ändern sich jedes mal, wenn ich den code ausführen: seltsam. (sorry, kann nicht den code für eine korrekte Darstellung)sortiert ist(d....items(), key=itemgetter(1), reverse=True) und
for key, val in sorted_keys: print "%s: %d" % (key, val)
- itemgetter erstellt eine Funktion, wenn es heißt, Sie nicht verwenden Sie es direkt, wie in deinem Beispiel. Und eine einfache iteration auf ein dict verwendet den Schlüssel, ohne die Werteich komme aus der Zukunft zu erzählen, die Sie von
collections.Counter
, die einemost_common
Methode, die Sie interessieren könnten 🙂InformationsquelleAutor Nas Banov
Den Sie verwenden könnten:
Diese Art Wörterbuch, indem die Werte der einzelnen Einträge in das Wörterbuch vom kleinsten zum größten.
Sortieren Sie in absteigender Reihenfolge nur hinzufügen
reverse=True
:(key, value)
Tupel.Ich bin neu in python und kam über die Notwendigkeit, Art ein Wörterbuch. Und ich möchte sichergehen, dass ich Verstand Sie gut: es gibt keinen Weg, um lambda zu Sortieren, ein Wörterbuch, richtig?
Von dem, was ich gesehen habe (docs.python.org/2/library/...), gibt es eine Klasse namens OrderedDict, die sortiert werden können und zu binden, um während immer noch ein Wörterbuch. Aus dem code-Beispiele, die Sie verwenden können, lambda zu Sortieren, aber ich habe nicht versucht, es persönlich 😛
Ich würde lieber
key=lambda (k, v): v
persönlichIch mag, dass
(k, v)
syntax auch, aber es ist nicht in Python 3, wo Tupel-parameter Auspacken wurde entfernt.InformationsquelleAutor Mark
Dicts kann nicht sortiert werden, aber Sie können eine sortierte Liste von Ihnen.
Einer sortierten Liste der dict-Werte:
Eine Liste von (Schlüssel, Wert) Paare, sortiert nach Wert:
In welcher Reihenfolge sind die keys mit dem gleichen Wert gelegt? Ich sortierte die Liste mit den Tasten zuerst, dann durch Werte, aber die Reihenfolge der Schlüssel mit dem gleichen Wert bleibt nicht.
das sind zwei verschiedene Dinge!
sorted(d.values())
gibt sortierte Liste der Werte aus dem Wörterbuch, wosorted(d, key=d.get)
gibt Liste der mit keys, sortiert in der Reihenfolge der Werte! Weise anders. Wenn Sie nicht sehen, die Notwendigkeit für die letztere, Lesen Sie mein post oben für "real-life" BeispielInformationsquelleAutor Roberto Bonvallet
In den letzten Python 2.7 haben wir die neue OrderedDict geben, das merkt sich die Reihenfolge, in der die Elemente Hinzugefügt wurden.
Einen neuen bestellt-Wörterbuch vom original, das Sortieren der Werte:
Den OrderedDict verhält sich wie ein normales dict:
Banov: es ist NICHT die Sortierung nach dem Schlüssel. es ist die Sortierung in der Reihenfolge, erstellen wir den Artikel. in unserem Fall, wir Sortieren nach dem Wert. leider ist der 3-Element dict war leider gewählt, so war die Reihenfolge die gleiche, wenn sortiert voth von Wert und Schlüssel, und so dehnte ich die Probe dict.
sorted(d.items(), key=lambda x: x[1])
Können Sie erklären, was diex
bedeutet, warum es dauern kannx[1]
zu lambda? Warum kann es nicht seinx[0]
? Ich danke Ihnen sehr!gibt eine Liste von Schlüssel/Wert-Paare aus dem Wörterbuch und
x
ist ein element dieses Tupels.x[0]
der Schlüssel sein, und diex[1]
wird der Wert. Wie wollen wir die Art auf den Wert, den wir passierenx[1]
zu lambda.gibt ein list-container der
(key, value)
Tupel.[0]
greift auf das erste element der Tupel -- der Schlüssel -- und[1]
greift auf das zweite element -- der Wert.InformationsquelleAutor mykhal
UPDATE: 5. DEZEMBER 2015 mit Python 3.5
Während ich fand die akzeptierte Antwort hilfreich, ich war auch überrascht, dass es noch nicht aktualisiert und verweist OrderedDict aus der standard-Bibliothek Sammlungen - Modul, das eine tragfähige, moderne alternative zur Lösung genau dieser Art von problem.
Den offiziellen OrderedDict Dokumentation bietet ein sehr ähnliches Beispiel zu, aber mit einem lambda-Ausdruck für die Funktion Sortieren:
InformationsquelleAutor arcseldon
So ziemlich das gleiche wie Hank Gay ' s Antwort:
Oder optimiert etwas wie vorgeschlagen durch John Fouhy:
Können Sie noch brauchen, um die swap (value,key) Tupel-Elemente, um am Ende mit dem (Schlüssel, Wert). Eine weitere Liste Verständnis ist dann erforderlich.
[(key, value) for (value, key) in sorted_list_of_tuples]
Nein, es ist besser, lassen Sie die eckigen Klammern, weil
sorted
wird wieder neu aufbauen müssen sowieso die Liste und Umbau von gencomp schneller sein wird. Gut für codegolfing, schlecht für die Geschwindigkeit. Halten Sie die hässliche([])
version.InformationsquelleAutor user26294
Es kann oft sehr praktisch zu bedienen namedtuple. Sie haben zum Beispiel ein Wörterbuch der 'name' als Schlüssel und 'score' als Werte-und Sie Sortieren möchten, auf 'score':
Sortierung mit der niedrigsten Punktzahl zuerst:
Sortierung mit der höchsten Punktzahl zuerst:
Nun können Sie den Namen und die Punktzahl von, sagen wir, der zweitbeste Spieler (index=1) sehr Pythonically wie diese:
as_list=[Player(v,k) für (k,v) in d....items()] as_dict=dict((p.name,p.score) für p in as_list)
InformationsquelleAutor Remi
Als der Python-3.6 die built-in dict bestellt werden
Gute Nachricht, also die OP ' s original-use-case-mapping-Paare aus einer Datenbank abgerufen werden, die mit eindeutiger string-ids als Schlüssel und numerische Werte, die als Werte in eine integrierte Python v3.6+ dict, sollten jetzt hinsichtlich der insert um.
Sagen, wenn die resultierende Tabelle zwei Spalten Ausdrücke aus einer Datenbank-Abfrage wie:
gespeichert werden würde in zwei Python-Tupeln, k_seq und v_seq (ausgerichtet von numerischen index und der gleichen Länge natürlich), dann:
Erlauben die Ausgabe später als:
nachgeben in diesem Fall (für die neue Python-3.6+ built-in dict!):
in der gleichen Reihenfolge pro Wert v.
Wo in der Python-3.5 installieren auf meinem Rechner derzeit ergibt:
Details:
Wie vorgeschlagen, in 2012 von Raymond Hettinger (vgl. mail auf python-dev mit dem Betreff "Kompakter Wörterbücher mit schneller iteration") und jetzt (im Jahr 2016) kündigte in einer E-mail von Victor Stinner auf python-dev mit dem Betreff "Python 3.6 dict wird kompakt und bekommt eine private version; und keywords werden bestellt" aufgrund der fix/Durchführung von Problem 27350 "Kompakt und bestellt dict" in Python 3.6 werden wir nun in der Lage sein, die Verwendung einer built-in dict zu pflegen, legen Sie um!!
Hoffentlich führt dies zu einer dünnen Schicht OrderedDict Umsetzung als ersten Schritt. @JimFasarakis-Hilliard angegeben, sehen einige Anwendungsfälle für die OrderedDict Art auch in der Zukunft. Ich denke, dass die Python-community werden sorgfältig prüfen, ob dies den test der Zeit stehen und was die nächsten Schritte sein werden.
Zeit zu überdenken, unsere Codierung Gewohnheiten, um nicht zu verpassen die Möglichkeiten von stabilen Ordnung:
Die erste, weil es erleichtert den Versand in die Implementierung von Funktionen und Methoden in einigen Fällen.
Die zweite, weil Sie Sie ermutigt, mehr leicht zu verwenden
dict
s als Zwischenspeicher in der Verarbeitung von Rohrleitungen.Raymond Hettinger freundlicherweise Dokumentation welche erklären, " Die Tech Hinter Python 3.6 Wörterbücher " - aus seiner San Francisco-Python-Meetup-Group-Präsentation 2016-DEC-08.
Und vielleicht schon einige Stack-Überlauf hoch dekoriert Frage-und-Antwort-Seiten erhalten Varianten dieses Informationen und viele hochwertige Antworten erfordern eine pro-version aktualisieren zu können.
Caveat Emptor (siehe aber auch unten, update 2017-12-15):
Als @ajcr zu Recht fest: "Die Reihenfolge-erhaltende Aspekt der neuen Implementierung ist als ein Implementierungsdetail und sollte nicht verlassen werden." (aus dem whatsnew36) nicht nit Kommissionierung, aber das Zitat wurde geschnitten, ein bisschen pessimistisch ;-). Es geht weiter " (dies könnte sich in Zukunft ändern, aber es wird gewünscht, diese neue dict-Umsetzung in die Sprache für ein paar releases, bevor die änderung der Sprache Skillung zu Mandat Auftrag-die Erhaltung der Semantik für alle gegenwärtigen und zukünftigen Python-Implementierungen; auch dies hilft bei der Erhaltung der rückwärts-Kompatibilität mit älteren Versionen der Sprache, wo zufällige iteration Bestellung ist noch immer in Kraft, z.B. Python 3.5)."
So, wie in einigen menschlichen Sprachen (z.B. Deutsch), die Nutzung von Formen der Sprache, und die wird jetzt erklärt wurde ... in whatsnew36.
Update 2017-12-15:
In einem mail an die python-dev-Liste, Guido van Rossum erklärt:
So, die version 3.6 CPython Nebeneffekt dict einfügen Bestellung ist jetzt Bestandteil der Sprache Skillung (und nicht mehr nur ein Implementierungsdetail). Das E-mail-thread auch aufgetaucht einige Besondere design-Ziele für
collections.OrderedDict
als daran erinnert, von Raymond Hettinger während der Diskussion.dict
geben wird Respekt einsetzen, um in Ihrem code. Dies ist nicht Teil der Sprache, die definition und die Umsetzung könnte sich ändern, in Zukunft bei jedem release. Weiter mitOrderedDict
zu gewährleisten, um.danke für die Warnung sehr dankbar - wie smileys und vielleicht waren gewebt in meiner Antwort,sollten diese angegeben, die Veränderung ist Massiv, aber natürlich nur für CPython (Referenz-Implementierung) und PyPy. Für etwas ganz anderes ... ich habe selten reden nicht-Umsetzung details beim Programmieren Mensch-Maschine-Anweisungen. Wenn wäre es nur gewesen, Jython 😉 ... ich könnte nicht den Mut hatte, es zu schreiben.
OrderedDict
definitiv nicht gelöscht werden; stattdessen wird es zu einem dünnen wrapper um die aktuellen dict-Umsetzung (so könnte man hinzufügen, dass es kompakter, auch). Hinzufügen das snippet mit derImportError
ist nicht ganz die beste Idee, weil es wegen Irreführung der Leser, dassOrderedDict
keine Verwendung hat.vielen Dank für das feedback. "Ziemlich beste Ideen" made me smile - die Zukunft ist oft schwer vorherzusagen. Aber ich mag Ihren Vorschlag überprüfen Sie die Quellen, versuchen Sie es, und aktualisieren Sie dann die Antwort entsprechend. Nochmals vielen Dank.
Diese Einschränkung ist nicht mehr zutreffend. Python ist3.7 garantiert geordnete Wörterbücher.
InformationsquelleAutor Dilettant
Ich hatte das gleiche problem, und ich löste es so:
(Menschen, die Antwort "Es ist nicht möglich zu Sortieren, dict" nicht Lesen die Frage! In der Tat, "ich kann irgendwie auf den Tasten, aber wie kann ich die Sortierung basierend auf den Werten?" meint eindeutig, dass er eine Liste der keys sortiert nach dem Wert der Werte.)
Bitte beachten Sie, dass die Reihenfolge ist nicht gut definiert (keys mit dem gleichen Wert in einer beliebigen Reihenfolge in die Ausgabe-Liste).
Beachten Sie, dass Sie beide Durchlaufen Wörterbuch und Holen der Werte Ihrer Schlüssel, so was Leistung und Performance betrifft dies nicht die optimale Lösung.
wie der Autor sagt, er interpretiert die Frage "kann ich die Liste der Schlüssel sortiert nach den Werten". Wir brauchen nicht die Werte in das Ergebnis, wir haben Sie im Wörterbuch.
InformationsquelleAutor jimifiki
In Python 2.7, einfach tun:
kopieren-einfügen von : http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes
Genießen 😉
InformationsquelleAutor sweetdream
Dies ist der code:
Hier sind die Ergebnisse:
Original
Rofl
Rang
InformationsquelleAutor PedroMorgan
Wenn die Werte numerisch sind können Sie auch
Counter
von Sammlungen.gibt
[('world', 300), ('python', 5), ('hello', 1)]
. Dies funktioniert tatsächlich für alle sortierbaren Wert geben (obwohl viele andere Counter-Operationen erfordern Werte, die vergleichbar mit int-Werten).InformationsquelleAutor Ivan Sas
Versuchen Sie den folgenden Ansatz. Lassen Sie uns definieren, ein Wörterbuch, genannt mydict mit den folgenden Daten:
Wenn man wollte, um die Art der dictionary-Schlüssel könnte man etwas machen wie:
Daraufhin sollten die folgende Ausgabe:
Auf der anderen Seite, wenn man wollte Art ein Wörterbuch von Wert (wie gefragt wird, in der Frage), könnte man Folgendes tun:
Das Ergebnis dieses Befehls (Sortierung der Wörterbuch-by-value) sollte Folgendes zurück:
for key, value in sorted(mydict.iteritems(), key=lambda (k,v): v["score"]):
können Sie Sortieren, indem Sie einen UnterschlüsselInformationsquelleAutor Nathaniel Payne
Können Sie erstellen einen "invertierten index", auch
Nun Ihre inverse hat die Werte; jeder Wert hat eine Liste von gültigen keys.
InformationsquelleAutor S.Lott
Können Sie die Sammlungen.Zähler. Beachten Sie, wird diese Arbeit für numerische und nicht-numerische Werte.
InformationsquelleAutor Abhijit
Ab von Python-3.6,
dict
Objekte werden jetzt bestellt durch insertion um. Es ist offiziell in den Spezifikationen von Python 3.7.Vorher mussten Sie auf
OrderedDict
.Python 3.7 Dokumentation sagt:
dict(sorted(words.items(), key=lambda x: x[1], reverse=True))
für DESCInformationsquelleAutor Maxime Chéramy
Können Sie eine überspringen dict das ist ein Wörterbuch, das ständig nach Ihren Werten sortiert.
Wenn Sie
keys()
,values()
oderitems()
dann werden Sie Durchlaufen, in sortierter Reihenfolge nach Wert.Es ist implementiert mit der skip-Liste datastructure.
InformationsquelleAutor malthe
InformationsquelleAutor Argun
Können Sie auch benutzerdefinierte Funktion, die übergeben werden können, zu drücken.
InformationsquelleAutor Vishwanath Rawat
Wie bereits von der Dilettant, Python 3.6 wird nun halten Sie die Reihenfolge! Ich dachte, ich würde teilen, eine Funktion, die ich schrieb, erleichtert die Sortierung der iterierbar (tuple, list, dict). Im letzteren Fall können Sie die Sortierung entweder auf dem Schlüssel oder Werte, und es dauert numerischen Vergleich berücksichtigt. Nur für >= 3.6!
Wenn Sie versuchen, mithilfe sortiert auf einem durchsuchbar hält, dass z.B. strings, ints, sortiert() schlägt fehl. Natürlich können Sie erzwingen, string-Vergleich mit str(). Jedoch, in einigen Fällen, die Sie tun möchten tatsächlichen numerischer Vergleich, wo
12
ist kleiner als20
(das ist nicht der Fall in den string-Vergleich). Also ich kam mit der folgenden. Wenn Sie möchten, explizite numerische Vergleich können Sie mit Hilfe der Flaggenum_as_num
die versuchen, die explizite numerische Sortierung, indem Sie versuchen, konvertieren Sie alle Werte auf schwimmt. Wenn das gelingt, wird es tun, numerische Sortierung, sonst wird ' resort auf string-Vergleich.Kommentare zur Verbesserung oder push-Anforderungen willkommen.
InformationsquelleAutor Bram Vanroy
Hier ist die Lösung mit den Reißverschluss auf
d....Werte()
und- d....keys()
. Ein paar Zeilen nach unten diesem link (auf Dictionary-Objekte anzeigen) ist:Also können wir tun, die folgenden:
InformationsquelleAutor Scott
Verwenden ValueSortedDict von dicts:
InformationsquelleAutor ponty
Durchlaufen ein dict und Art, die es durch seine Werte in absteigender Reihenfolge:
InformationsquelleAutor juhoh
Wenn Ihre Werte ganze zahlen sind, und verwenden Sie Python 2.7 oder neuer verwenden, können Sie
Sammlungen.Counter
stattdict
. Diemost_common
- Methode geben Sie alle Artikel, sortiert nach dem Wert.InformationsquelleAutor Petr Viktorin
Natürlich, denken Sie daran, Sie brauchen, um zu verwenden
OrderedDict
weil normale Python-dictionaries halten nicht die original-Reihenfolge.Wenn Sie nicht mit Python 2.7 oder höher, das beste, was Sie tun können, ist die Iteration über die Werte in einer generator-Funktion. (Es ist ein
OrderedDict
für 2.4 und 2.6 hier, abera) ich weiß nicht, wie gut es funktioniert
und
b) müssen Sie herunterladen und installieren Sie es natürlich. Wenn Sie nicht über administrativen Zugriff verfügen, dann fürchte ich, die option ist aus.)
Können Sie auch drucken Sie jeden Wert
Bitte denken Sie daran, entfernen Sie die Klammern nach dem drucken, wenn Sie nicht mit Python 3.0 oder höher
InformationsquelleAutor ytpillai
Dies funktioniert im 3.1.x:
InformationsquelleAutor iFail
Der Vollständigkeit halber, ich bin Entsendung eine Lösung mit heapq. Hinweis: diese Methode funktioniert sowohl für numerische und nicht-numerische Werte
InformationsquelleAutor Abhijit
Gerade gelernt, relevante Fähigkeiten aus Python für Alle.
Können Sie eine temporäre Liste, um Ihnen helfen, Sortieren Sie die Wörterbuch:
Wenn Sie möchten, um die Liste zu Sortieren in absteigender Reihenfolge, ändern Sie einfach die original-Sortieranlage:
Liste Verständnis, das ein liner wäre:
Beispiel-Ausgabe:
InformationsquelleAutor mcgag
InformationsquelleAutor lessthanl0l