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.

54voto

jimifiki Punkte 5142

Ich hatte das gleiche Problem und habe es wie folgt gelöst:

WantedOutput = sorted(MyDict, key=lambda x : MyDict[x]) 

(Diejenigen, die antworten "Es ist nicht möglich, ein Diktat zu sortieren", haben die Frage nicht gelesen! In der Tat bedeutet "Ich kann nach den Schlüsseln sortieren, aber wie kann ich nach den Werten sortieren?" eindeutig, dass er eine Liste der Schlüssel will, die nach dem Wert ihrer Werte sortiert ist).

Bitte beachten Sie, dass die Reihenfolge nicht genau festgelegt ist (Schlüssel mit demselben Wert werden in der Ausgabeliste in beliebiger Reihenfolge stehen).

52voto

Ivan Sas Punkte 973

Wenn die Werte numerisch sind, können Sie auch Counter de Sammlungen .

from collections import Counter

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

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

42voto

sweetdream Punkte 1151

In Python 2.7, einfach tun:

from collections import OrderedDict
# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by key
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

# dictionary sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

kopieren-einfügen von : http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes

Viel Spaß ;-)

32voto

Nathaniel Payne Punkte 2679

Versuchen Sie die folgende Vorgehensweise. Definieren wir ein Wörterbuch namens mydict mit den folgenden Daten:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

Wenn man das Wörterbuch nach Schlüsseln sortieren wollte, könnte man etwas wie folgt tun:

for key in sorted(mydict.iterkeys()):
    print "%s: %s" % (key, mydict[key])

Dies sollte die folgende Ausgabe ergeben:

alan: 2
bob: 1
carl: 40
danny: 3

Wollte man hingegen ein Wörterbuch nach Wert sortieren (wie in der Frage gefordert), könnte man folgendes tun:

for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
    print "%s: %s" % (key, value)

Das Ergebnis dieses Befehls (Sortieren des Wörterbuchs nach Wert) sollte Folgendes ergeben:

bob: 1
alan: 2
danny: 3
carl: 40

32voto

PedroMorgan Punkte 898

Dies ist der Code:

import operator
origin_list = [
    {"name": "foo", "rank": 0, "rofl": 20000},
    {"name": "Silly", "rank": 15, "rofl": 1000},
    {"name": "Baa", "rank": 300, "rofl": 20},
    {"name": "Zoo", "rank": 10, "rofl": 200},
    {"name": "Penguin", "rank": -1, "rofl": 10000}
]
print ">> Original >>"
for foo in origin_list:
    print foo

print "\n>> Rofl sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rofl")):
    print foo

print "\n>> Rank sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rank")):
    print foo

Hier sind die Ergebnisse:

Original

{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}

Rofl

{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}

Rang

{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}

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