Python 3 sorteert een dictaat op zijn waarden

De enige methoden die ik vond, werken voor python2 of retourneren alleen een lijst met tuples.

Is het mogelijk om het woordenboek te sorteren, b.v. {"aa": 3, "bb": 4, "cc": 2, "dd": 1}, door zijn waarden?

De volgorde van het gesorteerde woordenboek dat ik wil bereiken is van groot naar klein. Ik wil dat de resultaten er als volgt uitzien:

bb 4
aa 3
cc 2
dd 1

En na het sorteren wil ik het opslaan in een tekstbestand.


Antwoord 1, autoriteit 100%

itemgetter(zie andere antwoorden) is (zoals ik weet) efficiënter voor grote woordenboeken, maar in het algemeen denk ik dat d.getwint. En het vereist geen extra import.

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

Houd er rekening mee dat u ook d.__getitem__als key-functie kunt instellen, wat een kleine prestatieverbetering kan opleveren ten opzichte van d.get.


Antwoord 2, autoriteit 26%

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)))

afdrukken

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

Hoewel uit je laatste zin blijkt dat een lijst met tuples prima zou werken, bijvoorbeeld

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 wordt afgedrukt

bb 4
aa 3
cc 2
dd 1

Antwoord 3, autoriteit 18%

Je kunt sorteren op waardenin omgekeerdevolgorde (van groot naar klein) met een woordenboekbegrip:

{k: d[k] for k in sorted(d, key=d.get, reverse=True)}
# {'b': 4, 'a': 3, 'c': 2, 'd': 1}

Als u wilt sorteren op waardenin oplopende volgorde (van klein naar groot)

{k: d[k] for k in sorted(d, key=d.get)}
# {'d': 1, 'c': 2, 'a': 3, 'b': 4}

Als u wilt sorteren op toetsenin oplopende volgorde

{k: d[k] for k in sorted(d)}
# {'a': 3, 'b': 4, 'c': 2, 'd': 1}

Dit werkt op CPython 3.6+ en elke implementatie van Python 3.7+ omdat woordenboeken de volgorde van invoegen behouden.


Antwoord 4, autoriteit 13%

Een andere manier is om een ​​lambda-expressie te gebruiken. Afhankelijk van de tolkversie en of u een gesorteerd woordenboek of gesorteerde sleutelwaarde-tupels wilt maken (zoals het OP doet), kan dit zelfs sneller zijn dan het geaccepteerde antwoord.

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

Antwoord 5, autoriteit 8%

Om het woordenboek te sorteren, kunnen we gebruik maken van de operatormodule. Hieris de documentatie van de operatormodule.

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

Uitvoervolgorde zal een gesorteerde lijst zijn:

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

Als we willen sorteren op sleutels, kunnen we gebruik maken van

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

Uitvoervolgorde zal zijn:

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

Antwoord 6

Als u een woordenboek wilt sorteren en daarna als woordenboek wilt laten functioneren, kunt u OrderedDictuit de standaardbibliotheek.

Als dat niet is wat je nodig hebt, raad ik je aan om de sorteerfuncties te heroverwegen die je een lijst met tuples geven. Welke uitvoer wilde je, zo niet een geordende lijst van sleutel-waardeparen (tupels)?

Other episodes