Kaip rūšiuoti žodyną pagal vertę?

Turiu vertybių žodyną, skaitomą iš dviejų duomenų bazės laukų: eilutės lauko ir skaitmeninio lauko. Styginių laukas yra unikalus, todėl jis yra žodyno raktas.

Galiu rūšiuoti pagal raktus, bet kaip galiu rūšiuoti pagal vertybes?

Pastaba Aš perskaičiau kamino perpildymo klausimą. Kaip rūšiuoti žodynų sąrašą pagal žodynų reikšmes Python? o gal aš galiu pakeisti savo kodą, kad turėčiau žodynų sąrašą, bet kadangi man tikrai nereikia žodynų sąrašo, norėčiau sužinoti, ar yra paprastesnis sprendimas.

3065
05 марта '09 в 3:49 2009-03-05 03:49 Gern Blanston paklausė kovo 05'09 09:49 2009-03-05 03:49
@ 42 atsakymai
  • 1
  • 2

Neįmanoma surūšiuoti žodyno, kad gautumėte tik apie rūšiuojamo žodyno idėją. Žodynai iš esmės yra našlaičiai, tačiau kiti tipai, pvz., Sąrašai ir paketai, nėra. Todėl jums reikia užsakyto duomenų tipo, kad būtų pateiktos rūšiuojamos vertės, kurios bus sąrašas, galbūt sąrašų sąrašas.

Pavyzdžiui

 import operator x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0} sorted_x = sorted(x.items(), key=operator.itemgetter(1)) 

sorted_x bus sąrašų sąrašas, suskirstytas pagal antrąjį elementą kiekvienoje eilutėje. dict(sorted_x) == x .

Ir tiems, kurie nori rūšiuoti raktus vietoj vertybių:

 import operator x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0} sorted_x = sorted(x.items(), key=operator.itemgetter(0)) 

Python3, kadangi dekompresija neleidžiama [1], galime naudoti

 x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0} sorted_by_value = sorted(x.items(), key=lambda kv: kv[1]) 
3697
05 марта '09 в 3:59 2009-03-05 03:59 Atsakymas, kurį pateikė Devin Jeanpierre kovo 05'09, 03:59 2009-03-05 03:59

Lengviau nei: sorted(dict1, key=dict1.get)

Na, iš tiesų, galite padaryti „rūšiuoti pagal žodyno vertes“. Neseniai turėjau tai padaryti „Code Golf“ ( golfo kodo klausimas : žodžio dažnio diagrama ). Sutrumpinta problema buvo tokia: atsižvelgiant į tekstą, suskaičiuokite, kaip dažnai pasireiškia kiekvienas žodis, ir rodo viršutinių žodžių sąrašą, suskirstytą pagal mažėjantį dažnį.

Jei sukuriate žodyną su žodžiais raktiniais žodžiais ir kiekvieno žodžio skaičiumi kaip vertę, čia lengviau:

 from collections import defaultdict d = defaultdict(int) for w in text.split(): d[w] += 1 
border=0

tada galite surinkti pagal dažnį užsakytų žodžių sąrašą, sorted(d, key=d.get) - rūšiavimas atliekamas žodyno klavišais, naudojant žodžių skaičių kaip rūšiavimo raktą.

 for w in sorted(d, key=d.get, reverse=True): print w, d[w] 

Rašau šį išsamų paaiškinimą, kad iliustruotume, ką žmonės dažnai reiškia: „Aš galiu lengvai surūšiuoti žodyną pagal raktinius žodžius, bet kaip surūšiuoti pagal vertę“, ir manau, kad OP bandė išspręsti tokią problemą. Ir sprendimas yra surūšiuoti raktų sąrašą pagal vertybes, kaip parodyta aukščiau.

996
05 июля '10 в 11:01 2010-07-05 11:01 atsakymą pateikė Nas Banov, liepos 5 d., 10 d., 11:01 2010-07-05 11:01

Galite naudoti:

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

Jis rūšiuoja žodyną pagal kiekvieno įrašo reikšmes iš mažiausių iki didžiausių.

624
13 февр. Atsakymas pateikiamas Mark Feb 13 2010-02-13 19:33 '10, 19:33, 2010-02-13 19:33

„Dicts“ negali būti rūšiuojami, tačiau galite sukurti jų rūšiavimo sąrašą.

Rūšiuotas diktuojamų vertybių sąrašas:

 sorted(d.values()) 

Porų sąrašas (raktas, vertė), surūšiuotas pagal vertę:

 from operator import itemgetter sorted(d.items(), key=itemgetter(1)) 
175
05 марта '09 в 4:05 2009-03-05 04:05 atsakymą davė Roberto Bonvallet 2009 m. kovo 05 d., 04:05 2009-03-05 04:05

Naujausiame „Python 2.7“ yra naujas „ OrderedDict“, kuris prisimena elementų pridėjimo tvarką.

 >>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2} >>> for k, v in d.items(): ... print "%s: %s" % (k, v) ... second: 2 fourth: 4 third: 3 first: 1 >>> d {'second': 2, 'fourth': 4, 'third': 3, 'first': 1} 

Jei norite sukurti naują užsakytą žodyną iš originalo, surūšiuoti pagal vertę:

 >>> from collections import OrderedDict >>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1])) 

„OrderedDict“ elgiasi kaip normalus diktas:

 >>> for k, v in d_sorted_by_value.items(): ... print "%s: %s" % (k, v) ... first: 1 second: 2 third: 3 fourth: 4 >>> d_sorted_by_value OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)]) 
134
05 июля '10 в 5:50 2010-07-05 05:50 atsakymą mykhal pateikė liepos 5 d. 10 val. 5:50 2010-07-05 05:50

ATNAUJINIMAS: 2015 M. GRUODŽIO 5 D. naudojant „Python 3.5“

Nors aš suradau priimtiną atsakymą naudinga, taip pat nustebau, kad jis nebuvo atnaujintas prie „ OrderedDict“ nuorodos iš standartinės kolekcijos bibliotekos kaip perspektyvios, modernios alternatyvos, skirtos išspręsti tokią problemą.

 from operator import itemgetter from collections import OrderedDict x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0} sorted_x = OrderedDict(sorted(x.items(), key=itemgetter(1))) # OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]) 

Oficialus „ OrderedDict“ dokumentas taip pat siūlo labai panašų pavyzdį, tačiau naudojant lambda rūšiavimo funkciją

 # regular unsorted dictionary d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} # dictionary sorted by value OrderedDict(sorted(d.items(), key=lambda t: t[1])) # OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) 
79
05 дек. atsakymas pateiktas arcseldon 05 Dec. 2015-12-05 12:46 '15, 12:46, 2015-12-05 12:46

Dažnai labai patogu naudoti pavadinimą . Pavyzdžiui, žodyną „vardas“ turite kaip raktus ir „vertinimą“ kaip vertes, ir norite surūšiuoti pagal „reitingą“:

 import collections Player = collections.namedtuple('Player', 'score name') d = {'John':5, 'Alex':10, 'Richard': 7} 

rūšiavimas su mažiausiu rezultatu pirma:

 worst = sorted(Player(v,k) for (k,v) in d.items()) 

rūšiavimas su aukščiausiu rangu:

 best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True) 

Dabar galite gauti vardą ir rezultatą, tarkim, antras geriausias žaidėjas (indeksas = 1) yra labai pythoninis:

 player = best[1] player.name 'Richard' player.score 7 
66
30 авг. atsakymas pateikiamas Remi 30 rug. 2011-08-30 03:30 '11, 3:30, 2011-08-30 03:30

Panašiai kaip ir Hank Gay atsakymas;

 surūšiuoti ([(vertė, raktas) už (raktas, reikšmė) mydict.items ()])

Arba šiek tiek optimizuotas, kaip siūlo John Fuhey;

 surūšiuotas ((reikšmė, raktas) už (raktas, vertė) į mydict.items ())
60
05 марта '09 в 4:06 2009-03-05 04:06 atsakymą pateikė vartotojo26294 kovo 05 '09, 4:06 2009-03-05 04:06

3.6“ „Python“ sistemoje bus įdiegtas įmontuotas diktas.

Geros naujienos, todėl originalus pavyzdys, kaip naudoti OP korteles, gautas iš duomenų bazės su unikaliais eilutės identifikatoriais raktų ir skaitmeninių reikšmių pavidalu, įterptųjų Python v3.6 + dict vertėmis, dabar turėtų atitikti įterpimo tvarką.

Jei tai pasakysime dėl dviejų stulpelių lentelės išraiškų iš duomenų bazės užklausos, pavyzdžiui:

 SELECT a_key, a_value FROM a_table ORDER BY a_value; 

bus saugomi dviejuose „Python“ rinkiniuose: k_seq ir v_seq (suderinti su skaitmeniniu indeksu ir su tuo pačiu kurso ilgiu), tada:

 k_seq = ('foo', 'bar', 'baz') v_seq = (0, 1, 42) ordered_map = dict(zip(k_seq, v_seq)) 

Leisti išvestį vėliau:

 for k, v in ordered_map.items(): print(k, v) 

šiuo atveju (naujai įdiegta kalba Python 3.6+!)

 foo 0 bar 1 baz 42 

ta pačia tvarka pagal v vertę.

Kai „Python 3.5“ įdiegta mano kompiuteryje, ji šiuo metu pateikia:

 bar 1 foo 0 baz 42 

Išsami informacija:

Kaip 2012 m. Pasiūlė Raymondas Hettingeris (žr. Laišką „python-dev“ su tema „Daugiau kompaktiškų žodynų su greitesniu iteracija“ ) ir dabar (2016 m.), Paskelbtas Viktoro Stinerio laiške dėl „python-dev“ su tema „Python 3.6 diktas tampa kompaktiškas ir gauna asmeninę versiją, o raktiniai žodžiai tampa užsakomi “, nes Python 3.6 problema 27350 „ Kompaktiškas ir užsakytas diktatas “ išspręsta / įgyvendinama.

Tikimės, kad tai leis įgyvendinti pirmąjį žingsnį plonu OrderedDict sluoksniu. Kaip nurodė @ JimFasarakis-Hilliard, kai kurie iš jų taip pat mato atvejus, kai „OrderedDict“ tipas bus naudojamas ateityje. Manau, kad visa „Python“ bendruomenė kruopščiai patikrins, ar ji yra laiko bandymas ir kokie bus tolesni veiksmai.

Laikas permąstyti savo kodavimo įpročius, kad nepraleistume galimybių, atidarykite stabilų užsakymą:

  • Raktinių žodžių argumentai ir
  • (tarpinis) dikto saugojimas

Pirmasis, nes kai kuriais atvejais palengvina funkcijų ir metodų siuntimą.

Antra, todėl, kad rekomenduoja lengviau naudoti dict tarpinę saugyklą perdirbimo vamzdynuose.

Raymondas Hettingeris maloniai pateikė dokumentaciją, paaiškinančią „ The Python 3.6 žodynus “ - „San Francisco Python Meetup“ grupės pristatymą 2016-DEC-08.

O gal kai kurie didelės skiriamosios gebos puslapiai ir ngn-wiki.ru klausimai gaus šios informacijos variantus, ir daugelis aukštos kokybės atsakymų reikalauja atnaujinti kiekvieną versiją.

„Caveat Emptor“ (taip pat žr. Toliau pateiktą naujinimą 2017-12-15):

Kadangi @ajcr teisingai pažymi, „prioritetas išlaikyti šį naują įgyvendinimą laikomas įgyvendinimo detalu ir negali būti remiamasi“. (iš „ whatsnew36“ ), o ne citavimas , bet citata buvo sumažinta šiek tiek pesimistiškai ;-). Jis tęsiasi taip: „(tai gali pasikeisti ateityje, tačiau pageidautina, kad šis naujas dikto įgyvendinimas būtų keliomis kalbomis, prieš keisdamas privalomą privalomo semantikos palaikymo tvarką visiems dabartiniams ir būsimiems„ Python “diegimams, taip pat padeda išlaikyti atgalinį suderinamumą su senesnėmis versijomis kalba, kurioje atsitiktinė iteracijų tvarka vis dar galioja, pavyzdžiui, Python 3.5).

Taigi, kaip ir kai kuriose žmogiškosiose kalbose (pavyzdžiui, vokiečių kalba), vartojimas sudaro kalbą, o dabar valia bus paskelbta ... naujajame36 .

Atnaujinimas 2017-12-15:

Laiške „python-dev“ sąrašui Guido van Rossum nurodė:

Padarykite tai. „Dict taupo įterpimo tvarką“ yra sprendimas. Ačiū

Taigi CPython 3.6 versija, šalutinis efektas, reikalaujantis diktavimo įterpimo, dabar tampa kalbos specifikacijos dalimi (ir ne tik jos įgyvendinimo detalė). Šis pašto srautas taip pat atskleidė kai kuriuos išskirtinius collections.OrderedDict dizaino tikslus, o diskusijos metu prisiminė Raymondas collections.OrderedDict .

54
10 сент. Atsakymas pateikiamas Dilettant 10 Sep. 2016-09-10 13:05 '16 at 13:05 pm 2016-09-10 13:05

Šis žodynas

 e = {1:39, 4:34, 7:110, 2:87} 

Rūšiuoti

 sred = sorted(e.items(), key=lambda value: value[1]) 

Rezultatas

 [(4, 34), (1, 39), (2, 87), (7, 110)] 

Galite naudoti lambda funkciją rūšiuoti dalykus pagal vertę ir išsaugoti juos kintamajame, šiuo atveju su e šaltinio žodynu.

Tikiuosi, kad tai padės!

41
25 янв. Atsakymas duotas vyskupui 25 sausio. 2016-01-25 17:54 '16 at 17:54 2016-01-25 17:54

Turėjau tą pačią problemą ir išsprendžiau taip:

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

(Žmonės, kurie atsako į „Nepavyko surūšiuoti diktavimo“, neskaitė klausimo! Tiesą sakant, „galiu rūšiuoti pagal raktus, bet kaip galiu rūšiuoti pagal vertes?“ Akivaizdu, kad jis nori, kad raktų sąrašas būtų suskirstytas pagal jų reikšmes .)

Atkreipkite dėmesį, kad užsakymas nėra apibrėžtas (raktai su ta pačia verte išvesties sąraše bus savavališkai).

37
18 нояб. atsakymas, kurį pateikė jimifiki lapkričio 18 d 2010-11-18 17:19 '10, 17:19, 2010-11-18 17:19

„Python 2.7“ tiesiog paleiskite:

http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes 

Mėgaukitės; -)

31
22 авг. atsakymas pateikiamas „ sweetdream“ 22 d. 2013-08-22 11:38 '13, 11:38, 2013-08-22 11:38

Tai kodas:

 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 

Pateikiami rezultatai:

Originalas

 {'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} 

Reitingas

 {'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} 
23
08 марта '11 в 5:06 2011-03-08 05:06 atsakymą pateikė PedroMorgan kovo 8 d. 11 d. 5:06 2011-03-08 05:06

Jei reikšmės yra skaitinės, taip pat galite naudoti skaitiklį iš rinkinių.

 from collections import Counter x={'hello':1,'python':5, 'world':3} c=Counter(x) print c.most_common() >> [('python', 5), ('world', 3), ('hello', 1)] 
22
27 июня '12 в 18:43 2012-06-27 18:43 Ivan Sas atsakė birželio 27 d. 12 val. 18:43 2012-06-27 18:43

Techniškai žodynai nėra sekos ir todėl jų negalima surūšiuoti. Jūs galite padaryti kažką panašaus

 sorted(a_dictionary.values()) 

Darant prielaidą, kad našumas nėra didžiulis sandoris.

20
05 марта '09 в 3:56 2009-03-05 03:56 atsakymą pateikė „ Hank Gay“ kovo 05'09 09:56 2009-03-05 03:56

Taip pat galite sukurti „apverstą indeksą“

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

Dabar jūsų atvirkštiniai dalykai; kiekviena vertė turi taikomų raktų sąrašą.

 for k in sorted(inverse): print k, inverse[k] 
18
05 марта '09 в 4:52 2009-03-05 04:52 atsakymą pateikė S.Lott, kovo 05'09, 04:52 2009-03-05 04:52

Išbandykite šį metodą. Nustatykite žodį, vadinamą mydict, naudodami šiuos duomenis:

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

Jei norite surūšiuoti žodyną raktais, galite padaryti kažką panašaus:

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

Tai turėtų grąžinti šį rezultatą:

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

Kita vertus, jei norite surūšiuoti žodyną pagal vertę (kaip užduota klausime), galite atlikti šiuos veiksmus:

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

Šios komandos rezultatas (žodyno rūšiavimas pagal vertę) turėtų grąžinti:

 bob: 1 alan: 2 danny: 3 carl: 40 
18
07 апр. Atsakymą pateikė Nathaniel Payne, balandžio 7 d. 2014-04-07 07:46 '14 at 7:46 2014-04-07 07:46

Galite naudoti kolekcijas . Atkreipkite dėmesį, kad tai bus naudinga ir skaitmeninėms, ir ne skaitmeninėms reikšmėms.

 >>> 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)]) 
18
09 марта '13 в 15:30 2013-03-09 15:30 atsakymas pateikiamas „ Abhijit“ kovo 9 d. 13 val. 15:30 2013-03-09 15:30

Tai grąžina žodyno reikšmių porų sąrašą, surūšiuotą pagal vertę nuo didžiausio iki žemiausio:

 sorted(d.items(), key=lambda x: x[1], reverse=True) 

Jei naudojate žodyną, suskirstytą pagal raktą, naudokite šiuos veiksmus:

 sorted(d.items(), reverse=True) 

Grįžimas yra sąrašų sąrašas, nes patys žodynai negali būti rūšiuojami.

Tai gali būti išspausdinta arba išsiųsta tolesniems skaičiavimams.

15
12 февр. Atsakyti Zags Feb 12 2014-02-12 23:10 '14 at 11:10 2014-02-12 23:10

Galite naudoti praleidimo diktavimą , kuris yra žodynas, kuris yra nuolat surūšiuotas pagal vertę.

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

Jei naudojate keys() , values() arba items() , tada jums bus atlikta surūšiuota tvarka pagal vertę.

Jis įgyvendinamas naudojant duomenų struktūros sąrašų sąrašą .

14
26 сент. atsakymas pateikiamas salyklo 26 sep . 2014-09-26 01:56 '14 ne 1:56 2014-09-26 01:56
 from django.utils.datastructures import SortedDict def sortedDictByKey(self,data): """Sorted dictionary order by key""" sortedDict = SortedDict() if data: if isinstance(data, dict): sortedKey = sorted(data.keys()) for k in sortedKey: sortedDict[k] = data[k] return sortedDict 
13
01 нояб. Atsakymas pateikiamas Argun lapkričio 01 d. 2010-11-01 15:16 '10, 15:16, 2010-11-01 15:16

Taip pat galite naudoti pasirinktinę funkciją, kuri gali būti perduota raktui.

 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) 

Kitas būdas tai padaryti yra naudoti „labmda“ funkciją.

 x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0} sorted_x = sorted(x.items(), key=lambda t: t[1]) 
12
25 мая '17 в 21:13 2017-05-25 21:13 atsakymą pateikė Vishwanath Rawat, gegužės 25, 17, 21:13, 2017-25 21:13

Čia pateikiamas sprendimas, kuris naudoja „zip“ d.values() ir d.keys() . Kelios eilutės žemiau šios nuorodos (žodyno objektuose):

Tai leidžia sukurti poras (reikšmę, raktą) naudojant zip (): pair = zip (d.values ​​(), d.keys ()).

Taigi galime padaryti:

 d = {'key1': 874.7, 'key2': 5, 'key3': 8.1} d_sorted = sorted(zip(d.values(), d.keys())) print d_sorted # prints: [(5, 'key2'), (8.1, 'key3'), (874.7, 'key1')] 
9
20 июня '15 в 4:44 2015-06-20 04:44 atsakymą pateikė Scott birželio 20 d. 15 val. 4:44 2015-06-20 04:44

Naudokite „ ValueSortedDict“punktų :

 from dicts.sorteddict import ValueSortedDict d = {1: 2, 3: 4, 4:3, 2:1, 0:0} sorted_dict = ValueSortedDict(d) print sorted_dict.items() [(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)] 
7
19 окт. atsakymas pateikiamas ponty 19 oct. 2011-10-19 09:25 '11 at 9:25 am 2011-10-19 09:25

Aš atėjau su šiuo

 import operator x = {1: 2, 3: 4, 4:3, 2:1, 0:0} sorted_x = {k[0]:k[1] for k in sorted(x.items(), key=operator.itemgetter(1))} 

Python 3.x: x.items() vietoj iteritems() .

 >>> sorted_x {0: 0, 1: 2, 2: 1, 3: 4, 4: 3} 

Arba pabandykite naudoti collections.OrderedDict !

 x = {1: 2, 3: 4, 4:3, 2:1, 0:0} from collections import OrderedDict od1 = OrderedDict(sorted(x.items(), key=lambda t: t[1])) 
6
08 мая '13 в 11:17 2013-05-08 11:17 atsakymas pateikiamas 2010 m. gegužės 08 d. 13 val. 11:17 2013-05-08 11:17

Galite naudoti suskirstytą Python funkciją.

sorted(iterable[, cmp[, key[, reverse]]])

Taigi galite naudoti:

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

Jei norite gauti daugiau informacijos apie rūšiuojamą funkciją, atlikite šią nuorodą: https://docs.python.org/2/library/functions.html#sorted

6
21 нояб. atsakymas pateikiamas kkk 21 nov. 2014-11-21 18:04 '14, 18:04 2014-11-21 18:04

Iteravimas per diktavimą ir rūšiavimas pagal jo reikšmes mažėjančia tvarka:

 $ python --version Python 3.2.2 $ cat sort_dict_by_val_desc.py dictionary = dict(siis = 1, sana = 2, joka = 3, tuli = 4, aina = 5) for word in sorted(dictionary, key=dictionary.get, reverse=True): print(word, dictionary[word]) $ python sort_dict_by_val_desc.py aina 5 tuli 4 joka 3 sana 2 siis 1 
6
30 окт. atsakymas duotas juhoh spalio 30 d. 2011-10-30 22:42 '11 10:42 val. 2011-10-30 22:42

Žinoma, nepamirškite, kad turite naudoti „ OrderedDict nes įprastiniai „Python“ žodynai OrderedDict originalios tvarkos.

 from collections import OrderedDict a = OrderedDict(sorted(originalDict.items(), key = lambda x: x[1])) 

Jei neturite Python 2.7 ar naujesnės versijos, geriausias dalykas, kurį galite padaryti, yra kartoti per generatoriaus funkcijų reikšmes. (Čia yra užsakytasDict už 2.4 ir 2.6, bet

 a) I don't know about how well it works 

ir taip pat

 b) You have to download and install it of course. If you do not have administrative access, then I'm afraid the option out.) 

 def gen(originalDict): for x,y in sorted(zip(originalDict.keys(), originalDict.values()), key = lambda z: z[1]): yield (x, y) #Yields as a tuple with (key, value). You can iterate with conditional clauses to get what you want. for bleh, meh in gen(myDict): if bleh == "foo": print(myDict[bleh]) 

Taip pat galite spausdinti kiekvieną vertę.

 for bleh, meh in gen(myDict): print(bleh,meh) 

Nepamirškite pašalinti spausdinimo skliausteliuose, jei nenaudojate „Python 3.0“ ar naujesnės versijos.

6
31 июля '15 в 11:08 2015-07-31 11:08 atsakymą pateikė „ ytpillai“ liepos 31 d. 15 val. 11:08 2015-07-31 11:08

Kaip pažymėjo Dilettant , „Python 3.6“ dabar tvarkys! Maniau, kad naudosiu savo parašytą funkciją, kuri palengvina iteracijos rūšiavimą (eilutė, sąrašas, diktavimas). Pastaruoju atveju galite rūšiuoti pagal raktus arba pagal vertę, ir tai gali būti atsižvelgiama į skaitinį palyginimą. Tik> = 3,6!

Kai bandote naudoti rūšiavimą pagal iteraciją, kuri yra, pavyzdžiui,. eilutės, taip pat ints, rūšiuojamos () bus nesėkmingos. Žinoma, galite priversti styginių palyginimus su str (). Tačiau kai kuriais atvejais norite atlikti faktinį skaitinį palyginimą, kur 12 mažesnis nei 20 (tai nėra lyginant stygas). Todėl atėjau šiuos dalykus. Jei reikalingas aiškus skaitinis palyginimas, galite naudoti „ num_as_num vėliavą, kuri bandys atlikti aiškų kiekybinį rūšiavimą, bandydama konvertuoti visas reikšmes į plūdę. Jei tai pavyks, ji atliks skaitmeninę rūšiavimą, kitaip ji bus naudojama styginiams lyginti.

Sveiki atvykę į pastabas dėl patobulinimų ar užklausų .

 def sort_iterable(iterable, sort_on=None, reverse=False, num_as_num=False): def _sort(i): # sort by 0 = keys, 1 values, None for lists and tuples try: if num_as_num: if i is None: _sorted = sorted(iterable, key=lambda v: float(v), reverse=reverse) else: _sorted = dict(sorted(iterable.items(), key=lambda v: float(v[i]), reverse=reverse)) else: raise TypeError except (TypeError, ValueError): if i is None: _sorted = sorted(iterable, key=lambda v: str(v), reverse=reverse) else: _sorted = dict(sorted(iterable.items(), key=lambda v: str(v[i]), reverse=reverse)) return _sorted if isinstance(iterable, list): sorted_list = _sort(None) return sorted_list elif isinstance(iterable, tuple): sorted_list = tuple(_sort(None)) return sorted_list elif isinstance(iterable, dict): if sort_on == 'keys': sorted_dict = _sort(0) return sorted_dict elif sort_on == 'values': sorted_dict = _sort(1) return sorted_dict elif sort_on is not None: raise ValueError(f"Unexpected value {sort_on} for sort_on. When sorting a dict, use key or values") else: raise TypeError(f"Unexpected type {type(iterable)} for iterable. Expected a list, tuple, or dict") 
6
02 марта '18 в 19:48 2018-03-02 19:48 atsakymą pateikė Bram Vanroy kovo 2 d. 18 d. 19:48 2018-03-02 19:48

Jei jūsų vertės yra sveikieji skaičiai ir naudojate „Python 2.7“ ar naujesnę versiją, galite naudoti collections.Counter . Dažniausiai most_common metodas suteiks jums visus elementus, suskirstytus pagal vertę.

5
24 янв. Petr Viktorin atsakymas, pateiktas sausio 24 d 2012-01-24 22:28 '12 10:28 val. 2012-01-24 22:28
  • 1
  • 2

Kiti klausimai apie arba Užduoti klausimą