3413 Stimmen

Wie kann ich ein Wörterbuch nach Wert sortieren?

Ich habe ein Wörterbuch mit Werten, die aus zwei Feldern in einer Datenbank gelesen werden: ein Zeichenfolgenfeld und ein numerisches Feld. Das String-Feld ist eindeutig, daher ist es der Schlüssel des Wörterbuchs.

Ich kann nach den Schlüsseln sortieren, aber wie kann ich nach den Werten sortieren?

Hinweis: Ich habe die Stack Overflow-Frage hier gelesen Wie kann ich eine Liste von Wörterbüchern nach einem Wert des Wörterbuchs sortieren? und könnte wahrscheinlich meinen Code ändern, um eine Liste von Wörterbüchern zu haben, aber da ich nicht wirklich eine Liste von Wörterbüchern brauche, wollte ich wissen, ob es eine einfachere Lösung gibt, um entweder in aufsteigender oder absteigender Reihenfolge zu sortieren.

6886voto

Devin Jeanpierre Punkte 87113

Python 3.7+ oder CPython 3.6

Dicts behalten die Einfügereihenfolge in Python 3.7+ bei. Dasselbe in CPython 3.6, aber es ist ein Detail der Implementierung .

>>> x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

oder

>>> dict(sorted(x.items(), key=lambda item: item[1]))
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

Ältere Python

Es ist nicht möglich, ein Wörterbuch zu sortieren, sondern nur eine Darstellung eines sortierten Wörterbuchs zu erhalten. Wörterbücher sind von Natur aus ungeordnet, aber andere Typen wie Listen und Tupel sind es nicht. Sie brauchen also einen geordneten Datentyp, um sortierte Werte darzustellen, und das ist eine Liste - wahrscheinlich eine Liste von Tupeln.

Zum Beispiel,

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x ist eine Liste von Tupeln, sortiert nach dem zweiten Element in jedem Tupel. dict(sorted_x) == x .

Und für diejenigen, die nach Schlüsseln statt nach Werten sortieren wollen:

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

In Python3 seit Auspacken ist nicht erlaubt können wir

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

Wenn Sie die Ausgabe in Form eines Diktats wünschen, können Sie collections.OrderedDict :

import collections

sorted_dict = collections.OrderedDict(sorted_x)

1606voto

Nas Banov Punkte 27057

So einfach wie: sorted(dict1, key=dict1.get)

Nun, es ist tatsächlich möglich, eine "Sortierung nach Wörterbuchwerten" durchzuführen. Kürzlich musste ich das in einem Code Golf tun (Stack Overflow Frage Code Golf: Tabelle der Worthäufigkeit ). In Kurzform lautete das Problem so: Zählen Sie in einem Text, wie oft jedes Wort vorkommt, und zeigen Sie eine Liste der wichtigsten Wörter an, sortiert nach abnehmender Häufigkeit.

Wenn Sie ein Wörterbuch mit den Wörtern als Schlüssel und der Anzahl der Vorkommen jedes Wortes als Wert konstruieren, hier vereinfacht als:

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
    d[w] += 1

können Sie eine Liste der Wörter erhalten, geordnet nach Häufigkeit der Verwendung mit sorted(d, key=d.get) - die Sortierung durchläuft die Wörterbuchschlüssel, wobei die Anzahl der Wortvorkommen als Sortierschlüssel verwendet wird.

for w in sorted(d, key=d.get, reverse=True):
    print(w, d[w])

Ich schreibe diese ausführliche Erklärung, um zu veranschaulichen, was die Leute oft mit "Ich kann ein Wörterbuch leicht nach Schlüssel sortieren, aber wie sortiere ich nach Wert" meinen - und ich denke, der ursprüngliche Beitrag versuchte, ein solches Problem zu lösen. Die Lösung besteht darin, die Liste der Schlüssel nach den Werten zu sortieren, wie oben gezeigt.

1145voto

Mark Punkte 10695

Sie können es verwenden:

sorted(d.items(), key=lambda x: x[1])

Dadurch wird das Wörterbuch nach den Werten jedes Eintrags innerhalb des Wörterbuchs vom kleinsten zum größten sortiert.

Um sie in absteigender Reihenfolge zu sortieren, fügen Sie einfach reverse=True :

sorted(d.items(), key=lambda x: x[1], reverse=True)

Eingabe:

d = {'one':1,'three':3,'five':5,'two':2,'four':4}
a = sorted(d.items(), key=lambda x: x[1])    
print(a)

Ausgabe:

[('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]

266voto

Roberto Bonvallet Punkte 29281

Dicts können nicht sortiert werden, aber man kann aus ihnen eine sortierte Liste erstellen.

Eine sortierte Liste von dict-Werten:

sorted(d.values())

Eine Liste von (Schlüssel, Wert) Paaren, sortiert nach Wert:

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))

181voto

mykhal Punkte 18078

In Python 2.7 gibt es jetzt die neue OrderedDict Typ, der sich die Reihenfolge merkt, in der die Elemente hinzugefügt wurden.

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

Um aus dem Original ein neues geordnetes Wörterbuch zu erstellen, das nach den Werten sortiert ist:

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

Das OrderedDict verhält sich wie ein normales Diktat:

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X