2013-05-27 20 views
52

Angenommen, ich habe ein Diktat.Sortieren nach Wert python

data = {1:'b', 2:'a'} 

Und ich möchte, Daten sortieren, indem ‚b‘ und ‚a‘, damit ich das Ergebnis

'a','b' 

Wie kann ich das tun?
Irgendwelche Ideen?

+5

mögliche Duplikate von [Python-Wörterbuch-Werte sortieren] (http: //stackoverflow.com/questions/6046049/python-dictionary-values-sorting) –

+0

mögliche Duplikate von [Wie Wörterbücher nach Schlüsseln in Python sortiert werden] (http://stackoverflow.com/questions/4642501/how-to-sort -dictionaries-by-keys-in-python) – njzk2

+2

möglich duplikat von http://stackoverflow.com/questions/613183/python-sort-a-dictionary-by-value Werfen Sie einen Blick darauf: http: // stackoverflow. com/questions/613183/python-sort-a-dictionary-by-value/4215710 # 4215710 – jimifiki

Antwort

127

Um die Werte zu erhalten verwenden

sorted(data.values()) 

die passenden Schlüssel zu erhalten, verwenden Sie eine key Funktion

sorted(data, key=data.get) 

Um eine Liste von Tupeln geordnet nach Wert

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

Verwandte zu bekommen : Siehe die Diskussion hier: Dictionaries are ordered in Python 3.6+

Sortieren
+0

Ok, sorry. Was ich meinte, war zu bekommen (2: 'a', 1: 'b') ... irgendwelche Ideen? – kingRauk

+1

@kingRauk, dict's sind ungeordnet, aber Sie können eine geordnete Liste von Tupeln –

+0

sortierten (data.items(), key = Lambda x: x [1], reverse = True) für verehrte Reihenfolge – Mannu

7

die Werte:

sorted(data.values()) 

kehrt

['a','b'] 
4

Ich denke auch, es ist wichtig zu beachten, dass Python dict Objekttyp ist eine Hash-Tabelle (more on this here) und somit nicht in der Lage zu sein sortiert, ohne seine Schlüssel/Werte in Listen umzuwandeln. Was dies ermöglicht, ist dict Artikel Abruf in konstanter Zeit O(1), unabhängig von der Größe/Anzahl der Elemente in einem Wörterbuch.

gesagt haben, dass, wenn Sie die Tasten sortieren - sorted(data.keys()) oder Werte - sorted(data.values()) Sie dann diese Liste Zugriffstasten/Werte in Designmuster wie diese verwenden:

for sortedKey in sorted(dictionary): 
    print dictionary[sortedKeY] # gives the values sorted by key 

for sortedValue in sorted(dictionary.values()): 
    print sortedValue # gives the values sorted by value 

Hoffnung, das hilft.

+3

'sortierte (Wörterbuch)' ist besser als 'sorted (dictionary.keys())' – jamylak

+0

@jamylak danke für den Vorschlag, aber ich frage mich, ob es sich in einem anderen Muster verhält, als was '.keys()' tun würde? –

+1

Es ist semantisch gleichwertig aber schneller und idiomatischer – jamylak

29

Wenn Sie tatsächlich das Wörterbuch sortieren wollen, anstatt nur eine sortierte Liste collections.OrderedDict

>>> from collections import OrderedDict 
>>> from operator import itemgetter 
>>> data = {1: 'b', 2: 'a'} 
>>> d = OrderedDict(sorted(data.items(), key=itemgetter(1))) 
>>> d 
OrderedDict([(2, 'a'), (1, 'b')]) 
>>> d.values() 
['a', 'b'] 
+0

Das traurige ist, dass in Python 2.6.5 ... unterstützt OrderedDict – kingRauk

+5

@kingRauk dann nicht Ihre Frage Python 2.7 .... Auch eine Menge Dinge Sie haben in den Kommentaren erwähnt sollte in Ihrer Frage gewesen sein, mit – jamylak

+0

zu beginnen Yeah, sorry für das ... – kingRauk

14

Von Ihrem Kommentar verwenden zu erhalten Antwort auf gnibbler, ich würde sagen, dass Sie eine Liste von Paaren von Schlüssel-Wert wollen sortiert nach Wert:

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

Danke für alle Antworten. Sie sind alle meine Helden ;-)

am Ende so etwas wie dies getan habe:

d = sorted(data, key = d.get) 

for id in d: 
    text = data[id] 
1

In Ihrem Kommentar als Antwort auf John, schlagen Sie vor, dass Sie die Schlüssel und Werte des Wörterbuchs wollen, nicht nur die Werte.

PEP 256 schlägt dies zum Sortieren eines Wörterbuchs nach Werten vor.

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

Wenn Sie bestellen möchten absteigend, tun dies

sorted(d.iteritems(), key=itemgetter(1), reverse=True) 
0

keine Lambda-Methode

# sort dictionary by value 
d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'} 
def getkeybyvalue(d,i): 
    for k, v in d.items(): 
     if v == i: 
      return (k) 

sortvaluelist = sorted(d.values()) 
sortresult ={} 
for i1 in sortvaluelist: 
    key = getkeybyvalue(d,i1) 
    sortresult[key] = i1 
print ('=====sort by value=====') 
print (sortresult) 
print ('=======================') 
0

Sie erstellt Liste von Werten sortiert konnte und wieder aufzubauen, das Wörterbuch:

myDictionary={"two":"2", "one":"1", "five":"5", "1four":"4"} 

newDictionary={} 

sortedList=sorted(myDictionary.values()) 

for sortedKey in sortedList: 
    for key, value in myDictionary.items(): 
     if value==sortedKey: 
      newDictionary[key]=value 

Ausgabe: newDict ionary = {'eins': '1', 'zwei': '2', '1vier': '4', 'fünf': '5'}

Verwandte Themen