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.

28voto

S.Lott Punkte 371691

Sie können auch einen "invertierten Index" erstellen

from collections import defaultdict
inverse= defaultdict( list )
for k, v in originalDict.items():
    inverse[v].append( k )

Ihr Inversum hat nun die Werte; jeder Wert hat eine Liste von zutreffenden Schlüsseln.

for k in sorted(inverse):
    print k, inverse[k]

27voto

Abhijit Punkte 58646

Sie können die Sammlungen.Zähler . Beachten Sie, dass dies sowohl für numerische als auch für nicht-numerische Werte funktioniert.

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> from collections import Counter
>>> #To sort in reverse order
>>> Counter(x).most_common()
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> Counter(x).most_common()[::-1]
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
>>> #To get a dictionary sorted by values
>>> from collections import OrderedDict
>>> OrderedDict(Counter(x).most_common()[::-1])
OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

25voto

Eamonn Kenny Punkte 1601

Die in einer anderen Antwort erwähnte Collections-Lösung ist absolut hervorragend, weil man eine Verbindung zwischen dem Schlüssel und dem Wert beibehält, was im Falle von Wörterbüchern extrem wichtig ist.

Ich bin mit der ersten Möglichkeit, die in einer anderen Antwort vorgestellt wurde, nicht einverstanden, weil sie die Schlüssel wegwirft.

Ich habe die oben erwähnte Lösung verwendet (untenstehender Code) und den Zugriff auf Schlüssel und Werte beibehalten, und in meinem Fall war die Reihenfolge auf den Werten, aber die Bedeutung war die Reihenfolge der Schlüssel nach der Reihenfolge der Werte.

from collections import Counter

x = {'hello':1, 'python':5, 'world':3}
c=Counter(x)
print( c.most_common() )

>> [('python', 5), ('world', 3), ('hello', 1)]

21voto

Vishwanath Rawat Punkte 467

Sie können auch eine benutzerdefinierte Funktion verwenden, die an den Schlüssel übergeben werden kann.

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

19voto

malthe Punkte 895

Sie können eine Diktat überspringen das ein Wörterbuch ist, das permanent nach Wert sortiert ist.

>>> data = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> SkipDict(data)
{0: 0.0, 2: 1.0, 1: 2.0, 4: 3.0, 3: 4.0}

Wenn Sie keys() , values() o items() dann werden Sie nach Wert sortiert iterieren.

Sie wird mit Hilfe der Liste überspringen Datastruktur.

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