Kako sortirati rječnik po vrijednosti?

Imam rječnik vrijednosti čitan iz dva polja u bazi podataka: niz polja i numeričko polje. Polje stringa je jedinstveno, stoga je riječ o rječniku.

Mogu sortirati po ključevima, ali kako mogu sortirati na temelju vrijednosti?

Napomena. Pročitao sam pitanje preljeva steka: Kako razvrstati popis rječnika pomoću rječničkih vrijednosti u Pythonu? i možda mogu promijeniti kod da imam popis rječnika, ali budući da mi stvarno nije potreban popis rječnika, želio bih znati postoji li jednostavnije rješenje.

3065
05 марта '09 в 3:49 2009-03-05 03:49 Gern Blanston je pitao 5. ožujka u 3:49 2009-03-05 03:49
@ 42 odgovora
  • 1
  • 2

Nije moguće sortirati rječnik, samo da biste dobili ideju o sortiranom rječniku. Rječnici su po prirodi siroče, ali drugi tipovi, kao što su popisi i tuple, nisu. Stoga vam je potreban naručeni tip podataka koji će predstavljati sortirane vrijednosti koje će biti popis, možda popis torkova.

Na primjer

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

sorted_x će biti popis torkova razvrstanih po drugom elementu u svakoj torki. dict(sorted_x) == x .

A za one koji žele sortirati ključeve umjesto vrijednosti:

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

U Python3, budući da dekompresija nije dopuštena [1], možemo koristiti

 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 Odgovor Devin Jeanpierre 5. ožujka u 3:59 2009-03-05 03:59

Lakše je od: sorted(dict1, key=dict1.get)

Zapravo, možete "sortirati prema rječničkim vrijednostima". Nedavno sam to morao učiniti u Code Golfu (pitanje golf golf: dijagram frekvencije riječi ). Skraćeno, problem je bio sljedeći: s obzirom na tekst, prebrojite koliko se često pojavljuje svaka riječ i prikazuje popis gornjih riječi razvrstanih prema smanjenoj učestalosti.

Ako izradite rječnik s riječima u obliku ključeva i broj pojavljivanja svake riječi kao vrijednost, ovdje je lakše:

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

tada možete dobiti popis riječi poredanih po frekvenciji koristeći sorted(d, key=d.get) - razvrstavanje se vrši pomoću ključeva rječnika, koristeći broj pojavljivanja riječi kao ključ za razvrstavanje.

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

Pišem ovo detaljno objašnjenje kako bih ilustrirao ono što ljudi često misle pod "Mogu jednostavno sortirati rječnik po ključnim riječima, ali kako sam sortirati po vrijednosti" - i mislim da je OP pokušavao riješiti takav problem. A rješenje je sortirati popis tipki na temelju vrijednosti, kao što je prikazano gore.

996
05 июля '10 в 11:01 2010-07-05 11:01 odgovor je dao Nas Banov 5. srpnja 2010. u 11:01 2010-07-05 11:01

Možete koristiti:

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

On sortira rječnik po vrijednostima svakog unosa u rječniku od najmanjeg do najvećeg.

624
13 февр. Odgovor je dan Mark 13. veljače 2010-02-13 19:33 '10 u 19:33 2010-02-13 19:33

Diktati se ne mogu razvrstati, ali možete izraditi sortirani popis.

Sortirana lista vrijednosti dikta:

 sorted(d.values()) 

Popis parova (ključ, vrijednost), poredanih po vrijednosti:

 from operator import itemgetter sorted(d.items(), key=itemgetter(1)) 
175
05 марта '09 в 4:05 2009-03-05 04:05 odgovor je dao Roberto Bonvallet 5. ožujka 2009. u 4:05 2009-03-05 04:05

U najnovijem Pythonu 2.7 imamo novi OrderedDict koji pamti redoslijed dodavanja elemenata.

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

Da biste iz izvornika izradili novi naručeni rječnik, poredajte po vrijednosti:

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

OrderedDict ponaša se kao normalan dikt:

 >>> 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 odgovor je dao mykhal 05. srpnja '10 u 5:50 2010-07-05 05:50

UPDATE: 5. PROSINCA 2015. pomoću Pythona 3.5

Iako sam prihvatljivim odgovorom smatrao korisnim, također sam se iznenadio što nije ažuriran na link OrderedDict iz standardne biblioteke zbirki kao održiva, moderna alternativa - osmišljena za rješavanje točno ove vrste problema.

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

Službeni OrderedDict dokumentacija također nudi vrlo sličan primjer, ali koristeći lambda za funkciju sortiranja

 # 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 дек. odgovor dati arcseldon 05. 2015-12-05 12:46 '15 u 12:46 2015-12-05 12:46

Često je vrlo zgodno koristiti ime named . Na primjer, imate rječnik "ime" kao ključeve i "ocjenjivanje" kao vrijednosti, a želite sortirati prema "ocjeni":

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

prvo sortiranje s najnižim rezultatom:

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

sortiranje s najvišim rangom:

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

Sada možete dobiti ime i rezultat, recimo, drugi najbolji igrač (index = 1) je vrlo pitonski kako slijedi:

 player = best[1] player.name 'Richard' player.score 7 
66
30 авг. odgovor je dat Remi 30 aug. 2011-08-30 03:30 '11 u 3:30 2011-08-30 03:30

Isto kao i odgovor Hanka Gaya;

 poredano ([(vrijednost, ključ) za (ključ, vrijednost) u mydict.items ()])

Ili malo optimiziran, kao što je predložio John Fuhey;

 sortirano ((vrijednost, ključ) za (ključ, vrijednost) u mydict.items ()
60
05 марта '09 в 4:06 2009-03-05 04:06 odgovor je dao user26294 5. ožujka u 4:06 2009-03-05 04:06

Za Python 3.6 , ugrađeni dict će biti instaliran.

Dobra vijest, tako da izvorni primjer korištenja OP kartica izvedenih iz baze podataka s jedinstvenim nizom identifikatora u obliku ključeva i numeričkih vrijednosti kao vrijednosti u ugrađenom Pythonu v3.6 + dict sada bi trebao poštivati ​​redoslijed umetanja.

Ako to kažemo kao rezultat dva izraza tablice stupaca iz upita baze podataka, na primjer:

 SELECT a_key, a_value FROM a_table ORDER BY a_value; 

bit će pohranjena u dva Python tuplesa, k_seq i v_seq (poravnana na numeričkom indeksu is istom duljinom tečaja), a zatim:

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

Dozvoli izlaz kasnije:

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

u ovom slučaju (za novi ugrađeni jezik Python 3.6+!):

 foo 0 bar 1 baz 42 

u istom redoslijedu na vrijednosti v.

Gdje je u Python 3.5 instaliran na mom računalu, trenutno daje:

 bar 1 foo 0 baz 42 

pojedinosti:

Kao što je 2012. predložio Raymond Hettinger (vidi pismo u python-devu s temom "Kompaktniji rječnici s bržom iteracijom" ) i sada (2016.), objavljeno je u pismu Viktora Stinera o python-devu s temom "Python 3.6 dict postaje kompaktan i dobiva osobnu verziju, a ključne riječi postaju naručene " zbog popravka / implementacije problema 27350 " Kompaktni i uređeni diktati " u Pythonu 3.6 sada možemo koristiti ugrađeni dict za održavanje redoslijeda umetanja!

Nadamo se da će to dovesti do implementacije tankog sloja OrderedDict kao prvog koraka. Kao što je istaknuo @ JimFasarakis-Hilliard, neki od njih također vide slučajeve korištenja tipa OrderedDict u budućnosti. Mislim da će Python zajednica kao cjelina pažljivo provjeriti stoji li test vremena i što će biti sljedeći koraci.

Vrijeme je da preispitamo naše navike kodiranja, kako ne bismo propustili mogućnosti, otvorili stabilno naručivanje

  • Argumenti ključnih riječi i
  • (srednje) skladište dikta

Prvi, jer u nekim slučajevima olakšava slanje u provedbi funkcija i metoda.

Drugo, jer preporučuje korištenje dict lakše kao međufazu u procesnim cjevovodima.

Raymond Hettinger je ljubazno dostavio dokumentaciju s objašnjenjem " Tehnologija iza Python 3.6 rječnika " - s njegove prezentacije u San Francisco Python Meetup Group 2016-DEC-08.

A možda će neke stranice visoke razlučivosti i solopackaging.ru pitanja dobiti varijacije tih informacija, a mnogi visokokvalitetni odgovori zahtijevat će ažuriranja za svaku verziju.

Caveat Emptor (ali pogledajte i ažuriranje 2017-12-15 dolje):

Kao što @ajcr s pravom primjećuje: "Prioritet održavanja ove nove implementacije smatra se detaljom provedbe i na nju se ne može pouzdati". (iz whatsnew36 ) ne branje gnjida , ali citat je bio malo pesimističan ;-). Nastavlja se kao "(to se može promijeniti u budućnosti, ali poželjno je da ova nova implementacija dicta bude na jeziku za nekoliko izdanja prije promjene specifikacije jezika za obveznu semantiku održavanja reda za sve trenutne i buduće implementacije Pythona, također pomaže u održavanju kompatibilnosti s starijim verzijama jezik, gdje je slučajni red iteracija još uvijek važeći, na primjer, Python 3.5).

Dakle, kao u nekim ljudskim jezicima (na primjer, na njemačkom), upotreba tvori jezik, a sada će se objaviti volja ... u onome što je novo36 .

Ažuriranje 2017-12-15:

U pismu na Python-dev listi , Guido van Rossum je izjavio:

Učinite to. "Dict sprema redoslijed umetanja" je rješenje. Hvala vam

Dakle, verzija 3.6 CPythona, nuspojava naručivanja umetanja dikta, sada postaje dio specifikacije jezika (i ne samo da je to detalj provedbe). Ovaj protok pošte također je otkrio neke karakteristične ciljeve dizajna za collections.OrderedDict , kako se prisjećao Raymond Hettinger tijekom rasprave.

54
10 сент. Odgovor je dan Dilettant 10 Sep. 2016-09-10 13:05 '16 u 13:05 sati 2016-09-10 13:05

Ovaj rječnik

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

sortiranje

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

Rezultat

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

Možete koristiti lambda funkciju za sortiranje stvari po vrijednosti i pohranu u varijablu, u ovom slučaju sred s e- rječnikom .

Nadam se da ovo pomaže!

41
25 янв. Odgovor je dat biskupu 25 jan. 2016-01-25 17:54 '16 u 17:54 2016-01-25 17:54

Imao sam isti problem i riješio ga na sljedeći način:

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

(Ljudi koji odgovaraju "Nije moguće sortirati diktat" nisu pročitali pitanje! Zapravo, "Mogu sortirati po ključevima, ali kako mogu sortirati po vrijednostima?" Jasno znači da on želi popis ključeva razvrstanih po njihovim značenjima ).

Napominjemo da redoslijed nije definiran (ključevi s istom vrijednošću će biti u proizvoljnom redoslijedu na izlaznom popisu).

37
18 нояб. odgovor dao jimifiki 18. stu 2010-11-18 17:19 '10 u 17:19 2010-11-18 17:19

U Pythonu 2.7, jednostavno pokrenite:

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

uživajte; -)

31
22 авг. odgovor je dan slatki 22 aug. 2013-08-22 11:38 '13 u 11:38 2013-08-22 11:38

Ovo je kôd:

 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 

Evo rezultata:

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} 
23
08 марта '11 в 5:06 2011-03-08 05:06 odgovor je dao PedroMorgan 8. ožujka '11 u 5:06 2011-03-08 05:06

Ako su vrijednosti brojčane, možete koristiti i brojač iz zbirki.

 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 Odgovor je dao Ivan Sas 27. lipnja 2012. u 18:43 2012-06-27 18:43

Tehnički, rječnici nisu sekvence i stoga se ne mogu sortirati. Možeš učiniti nešto slično

 sorted(a_dictionary.values()) 

Pretpostavljajući da izvedba nije velika stvar.

20
05 марта '09 в 3:56 2009-03-05 03:56 odgovor je dao Hank Gay 5. ožujka u 3:56 2009-03-05 03:56

Također možete stvoriti "invertirani indeks"

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

Sada su vaše inverzne stvari; svaka vrijednost ima popis primjenjivih tipki.

 for k in sorted(inverse): print k, inverse[k] 
18
05 марта '09 в 4:52 2009-03-05 04:52 odgovor je dao S.Lott 5. ožujka u 4:52 2009-03-05 04:52

Pokušajte sljedeći pristup. Definirajte rječnik koji se zove Mydict sa sljedećim podacima:

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

Ako želite sortirati rječnik po ključevima, možete učiniti nešto poput:

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

To bi trebalo vratiti sljedeći rezultat:

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

S druge strane, ako trebate sortirati rječnik po vrijednosti (kao što je postavljeno u pitanju), možete učiniti sljedeće:

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

Rezultat ove naredbe (sortiranje rječnika prema vrijednosti) trebao bi vratiti sljedeće:

 bob: 1 alan: 2 danny: 3 carl: 40 
18
07 апр. Odgovor je dao Nathaniel Payne 07. travnja. 2014-04-07 07:46 '14 u 7:46 2014-04-07 07:46

Možete koristiti zbirke . Imajte na umu da će to raditi i za numeričke i za ne-numeričke vrijednosti.

 >>> 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 odgovor je dat Abhijit 9. ožujka '13 u 15:30 2013-03-09 15:30

Time se vraća popis parova ključ / vrijednost u rječniku, sortiran prema vrijednosti od najviše do najniže:

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

Za rječnik po ključu koristite sljedeće:

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

Povratak je popis torkova, jer se sami rječnici ne mogu sortirati.

To se može ispisati ili poslati za daljnje izračune.

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

Možete koristiti preskakanje dikta , koji je rječnik koji se stalno sortira po vrijednosti.

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

Ako koristite keys() , values() ili items() , proći ćete poredani poredak po vrijednosti.

Provodi se pomoću popisa prijelaza u strukturi podataka.

14
26 сент. odgovor je dan 26 mjeseci . 2014-09-26 01:56 '14 u 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 нояб. Odgovor je dat Argun 01 Nov. 2010-11-01 15:16 '10 u 15:16 2010-11-01 15:16

Također možete koristiti prilagođenu funkciju koja se može proslijediti ključu.

 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) 

Drugi način da to učinite je da koristite labmda funkciju.

 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 odgovor je dao Vishwanath Rawat 25. svibnja '17 u 21:13 2017-05-25 21:13

Ovo je rješenje koje koristi zip na d.values() i d.keys() . Nekoliko redova na ovoj vezi (na rječničkim objektima):

To vam omogućuje stvaranje parova (vrijednost, ključ) pomoću zip (): pair = zip (d.values ​​(), d.keys ()).

Tako možemo učiniti sljedeće:

 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 odgovor je dao Scott 20. lipnja '15. u 4:44 2015-06-20 04:44

Upotrijebi ValueSortedDict iz diktata :

 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 окт. odgovor je dan ponty 19 oct. 2011-10-19 09:25 '11 u 9:25 am 2011-10-19 09:25

Došao sam s ovim

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

Za Python 3.x: x.items() umjesto iteritems() .

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

Ili pokušajte koristiti 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 odgovor je dat oktoback 08. svibanj '13 u 11:17 2013-05-08 11:17

Možete koristiti sortiranu Python funkciju.

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

Možete koristiti:

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

Za više informacija o razvrstanoj funkciji slijedite ovaj link: https://docs.python.org/2/library/functions.html#sorted

6
21 нояб. odgovor je dan kkk 21 nov. 2014-11-21 18:04 '14 u 18:04 2014-11-21 18:04

Ponavljanje kroz diktat i sortiranje po vrijednostima u silaznom redoslijedu:

 $ 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 окт. odgovor dati juhoh 30. listopada. 2011-10-30 22:42 '11 u 22:42 2011-10-30 22:42

Naravno, zapamtite da morate koristiti OrderedDict jer redoviti Python rječnici ne čuvaju izvorni poredak.

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

Ako nemate Python 2.7 ili noviju verziju, najbolje je da ponovite vrijednosti u funkciji generatora. (Tu je naručeni Dik za 2.4 i 2.6 ovdje , ali

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

i također

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

Također možete ispisati svaku vrijednost.

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

Ne zaboravite ukloniti zagrade nakon ispisa ako ne koristite Python 3.0 ili noviji.

6
31 июля '15 в 11:08 2015-07-31 11:08 odgovor je dao ytpillai 31. srpnja '15 u 11:08 2015-07-31 11:08

Kao što je Dilettant primijetio , Python 3.6 će sada zadržati red! Mislio sam da ću koristiti funkciju koju sam napisao, što olakšava sortiranje iteracije (tuple, list, dict). U potonjem slučaju, možete sortirati bilo ključevima ili po vrijednosti, a to može uzeti u obzir numeričku usporedbu. Samo za> = 3.6!

Kada pokušate koristiti sortiranje po iteraciji, koja je, na primjer, spremljena. nizovi, kao i ints, sortirani () neće uspjeti. Naravno, možete prisiliti usporedbe nizova s ​​str (). Međutim, u nekim slučajevima želite napraviti stvarnu numeričku usporedbu, gdje je 12 manje od 20 (što nije slučaj kod uspoređivanja nizova). Stoga sam smislio sljedeće. Ako vam je potrebna eksplicitna numerička usporedba, možete koristiti zastavicu num_as_num , koja će pokušati izvesti eksplicitno kvantitativno sortiranje, pokušavajući pretvoriti sve vrijednosti u float. Ako uspije, izvršit će numeričku vrstu, inače će se koristiti za usporedbu nizova.

Komentari za poboljšanja ili zahtjeve za guranje su dobrodošli.

 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 odgovor je dao Bram Vanroy 02. ožujka u 19:48 sati 2018-03-02 19:48

Ako su vaše vrijednosti cijeli brojevi, a vi koristite Python 2.7 ili noviji, možete koristiti collections.Counter umjesto dict . Metoda most_common dat će vam sve stavke poredane po vrijednosti.

5
24 янв. Odgovor dao je Petr Viktorin 24. siječnja 2012-01-24 22:28 '12 u 22:28 2012-01-24 22:28
  • 1
  • 2