2014-01-06 5 views
25

Die einzigen Methoden, die ich gefunden habe, funktionieren nur für python2 oder geben nur Tupel-Listen zurück.Python 3 Ein Diktat nach seinen Werten sortieren

Ist es möglich, Wörterbuch, z. {"aa": 3, "bb": 4, "cc": 2, "dd": 1}, nach seinen Werten?

Reihenfolge des sortierten Wörterbuchs, das ich erreichen möchte, ist vom größten zum kleinsten. So wollte das Ergebnis ähnlich sein:

Und nach dem Sortieren werde ich es in eine Textdatei speichern.

Antwort

41

itemgetter (andere Antworten sehen) ist (ich weiß) effiziente für großen Wörterbücher aber für den gemeinsamen Fall, ich glaube, dass d.get gewinnt. Und es erfordert kein extra import.

>>> d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1} 
>>> s = [(k, d[k]) for k in sorted(d, key=d.get, reverse=True)] 
>>> for k, v in s: 
...  k, v 
... 
('bb', 4) 
('aa', 3) 
('cc', 2) 
('dd', 1) 

anzumerken, dass alternativ können Sie d.__getitem__ als key Funktion gesetzt, die eine kleine Leistungssteigerung über d.get liefern.

+1

Vielen Dank, Ihre Lösung ist am einfachsten :) –

+0

Könnten Sie bitte erklären | erweitern Sie die Syntax in Zeile 2? Ich lerne nur Python 3 und würde es gerne verstehen. – Serge

+1

Sicher aber es wäre einfacher wenn ich wüsste was du nicht verstehst. '[x für x in iterable]' ist ein Python List Comprehension (google), das in Python sehr häufig zum Erstellen von Listen verwendet wird. '(k, d [k])' ist ein Zwei-Element-Tupel, das zweite Element ('d [k]') ist der Wert aus dem Wörterbuch.'sorted()' ist eine eingebaute Funktion, die die Schlüssel des Wörterbuchs nach den Werten sortiert. Mit 'key = d.get 'ist es der Schlüssel meiner Antwort, der nicht trivial zu wissen ist. Das Wissen über eingebaute Funktionen ist essentiell. Ich hoffe, das hat geholfen. – SzieberthAdam

0

Um ein Wörterbuch zu sortieren und es anschließend als Wörterbuch zu verwenden, können Sie OrderedDict aus der Standardbibliothek verwenden.

Wenn das nicht ist, was Sie brauchen, dann ermutige ich Sie, die Sortierfunktionen zu überdenken, die Sie mit einer Liste von Tupeln verlassen. Welche Ausgabe wollten Sie, wenn nicht eine geordnete Liste von Schlüssel-Wert-Paaren (Tupel)?

16
from collections import OrderedDict 
from operator import itemgetter  

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1} 
print(OrderedDict(sorted(d.items(), key = itemgetter(1), reverse = True))) 

druckt

OrderedDict([('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)]) 

Obwohl aus dem letzten Satz, scheint es, dass eine Liste von Tupeln ganz gut funktionieren würde, z.B.

from operator import itemgetter 

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1} 
for key, value in sorted(d.items(), key = itemgetter(1), reverse = True): 
    print(key, value) 

die

druckt
bb 4 
aa 3 
cc 2 
dd 1 
+0

Danke für Ihre Hilfe. Ich dachte, dass eine der Lösungen etwas Ähnliches sein wird. –

6

Um Wörterbuch zu sortieren, könnten wir Bedienermodul verwenden. Here ist die Dokumentation des Bedienermoduls.

import operator        #Importing operator module 
dc = {"aa": 3, "bb": 4, "cc": 2, "dd": 1} #Dictionary to be sorted 

dc_sort = sorted(dc.items(),key = operator.itemgetter(1),reverse = True) 
print dc_sort 

Ausgabereihenfolge wird eine sortierte Liste sein:

[('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)] 

Wenn wir in Bezug auf Schlüssel sortieren wollen, können wir den Einsatz von

dc_sort = sorted(dc.items(),key = operator.itemgetter(0),reverse = True) 

Ausgabereihenfolge wird machen:

[('dd', 1), ('cc', 2), ('bb', 4), ('aa', 3)] 
+0

Die Antwort von Paul Draper verwendet bereits Operator ... nur nicht die komplette Bibliothek importieren –

+0

@SalvatoreCosentino Genau und Sie möchten itemgetter explizit vom Operator importieren und dasselbe verwenden. – Reck

Verwandte Themen