Sözü dəyərlə necə sıralayırsınız?

Veritabanında iki sahədən oxunan dəyərlər lüğəti var: bir simli sahə və sayısal sahə. Simli sahə unikaldır, buna görə də lüğət açarıdır.

Klaviatura görə sıralayıram, amma dəyərlərə görə necə sıralayım?

Qeyd Yığın taşması sualını oxudum. Python'daki sözlük dəyərlərinə görə lüğətlərin siyahısını necə sıralayırsınız? və bəlkə lüğətlərimin bir siyahısını görmək üçün kodumu dəyişə bilərəm, amma həqiqətən sözlüklərin bir siyahısını tələb etməmiş olduğumdan daha sadə bir həll olub-olmadığını bilmək istərdim.

3065
05 марта '09 в 3:49 2009-03-05 03:49 Gern Blanston 05 mart 2009- cu il tarixində 3:49 'də soruşdu
@ 42 cavab
  • 1
  • 2

Lüğətə düzələnmək mümkün deyil, yalnız sıralalanmış lüğət haqqında fikir almaq. Lüğətlər təbiət yetimləridir, ancaq siyahlar və tupllər kimi digər növləri yoxdur. Buna görə, bir list olacaq sıralanan dəyərləri təmsil etmək üçün sifariş verilən məlumat növünə ehtiyacınız var, ehtimal ki, bir sıra siyahı.

Məsələn,

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

sorted_x hər bir sorted_x ikinci element tərəfindən sıralanan bir sıra siyahı olacaq. dict(sorted_x) == x .

Və dəyərlər əvəzinə açarları sıralamaq istəyənlər üçün:

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

Python3-də, dekompressiyaya icazə verilmədiyindən [1] istifadə edə bilərik

 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 Devin Jeanpierre tərəfindən verilmiş cavab 05.03 'da 03:59 ' da 2009-03-05 03:59

Daha asan: sorted(dict1, key=dict1.get)

Bəli, əslində, "lüğət dəyərlərinə görə sırala" edə bilərsiniz. Mən bu yaxınlarda Code Golf ( kod golf sual : söz diapazonu ) ilə bunu etmək məcburiyyətində oldum. Kısaltılmış problem bu idi: mətni nəzərə alaraq, hər bir sözün nə qədər tez-tez olacağını sayır və azaldılmış tezliklə sıralanan üst sözlərin siyahısını əks etdirir.

Açar şəklində sözlərlə lüğət və hər bir sözün dəyərinin bir dəyər kimi yaradıcısı varsa, burada daha asan olur:

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

sonra sorted(d, key=d.get) istifadə edərək tezliyə görə sifariş edilmiş sözlərin siyahısını əldə edə bilərsiniz - sıralama lüğət düymələri ilə həyata keçirilir, sözlərin sorted(d, key=d.get) kimi istifadə olunur.

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

İnsanlar tez-tez "Sözləri açar sözlər ilə asanlıqla düzəldə bilərik, amma necə qiymətə görə sıralayıram" demək üçün bu ətraflı izahat yazıram və məncə, OP belə bir problemi həll etməyə çalışırdı. Və həll yuxarıda göstərildiyi kimi, dəyərlər əsasında düymələrin siyahısını düzəldməkdir.

996
05 июля '10 в 11:01 2010-07-05 11:01 Cavab Nas Banov tərəfindən 05.07.10 11:01 tarixində verildi

Siz istifadə edə bilərsiniz:

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

Sözün lüğətdə ən azından ən böyükdən hər bir giriş dəyərinə görə lüğəti sıralayır.

624
13 февр. Cavab Mark 13 fevralda verilir 2010-02-13 19:33 '10 at 19:33 2010-02-13 19:33

Dicts sıralana bilməz, ancaq onların sıralanan bir siyahısını yarada.

Dict dəyərlərinin sıralanan siyahısı:

 sorted(d.values()) 

Qiymətə görə sıralanan cütlərin siyahısı (əsas, dəyər):

 from operator import itemgetter sorted(d.items(), key=itemgetter(1)) 
175
05 марта '09 в 4:05 2009-03-05 04:05 Cavab Roberto Bonvallet tərəfindən 05/09/09 tarixində 4: 05-03-03 04:05 tarixində verilmişdir

Son Python 2.7-də, elementlərin əlavə olunduğu sıranı xatırlayan yeni bir OrderedDict var.

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

Əsərdən yeni bir sifarişli lüğət yaratmaq üçün dəyərə görə sırala:

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

OrderedDict normal bir dict kimi davranır:

 >>> 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 Cavab 05 iyul 2010- cu il saat 05 : 50-da mykhal tərəfindən verilir . 2010-07-05 05:50

UPDATE: 5 DEKABR 2015, Python 3.5 istifadə edərək

Qəbul edilən cavabın faydalı olduğunu gördüyümdə, mən də bu cür problemin həlli üçün nəzərdə tutulmuş, standart toplama kitabxanasından OrderableDict linkinə canlı, müasir bir alternativ kimi yenilənməmiş olduğuna təəccübləndim.

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

Rəsmi OrderedDict sənədləri də çox oxşar bir nümunə təqdim edir, amma sort funksiyası üçün lambda istifadə edir

 # 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 дек. Cavab verildi 05 dekabr. 2015-12-05 12:46 '15 'də saat 12:46' de 2015-12-05 12:46

Tez-tez adlandırılmış istifadə etmək çox rahatdır. Məsələn, açar sözlərinizlə "ad" və dəyərlər kimi "reytinq" var və "reytinq" ilə sıralanırsınız:

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

İlk ən aşağı hesabla sıralama:

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

ən yüksək dərəcə ilə sıralanır:

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

İndi adı və hesabı əldə edə bilərsiniz, demək, ikinci yaxşı oyunçu (index = 1) çox pythonically aşağıdakı kimi:

 player = best[1] player.name 'Richard' player.score 7 
66
30 авг. cavabı Remi 30 aug verilir . 2011-08-30 03:30 '11 saat 03:30 'da 2011-08-30 03:30

Hank Gay'in cavabı ilə eyni;

 mydict.items (), (açar, dəyər) üçün sıralandı ()]

Yoxsa bir az optimallaşdırılmış, John Fueyinin təklif etdiyi kimi;

 mydict.items () üçün (açar, dəyər) sıralanır ((dəyər, açar)
60
05 марта '09 в 4:06 2009-03-05 04:06 cavab 05.03.2009 04:06 ilə 04.03.2009 tarixində istifadəçi tərəfindən verilmişdir

Python 3.6 üçün quraşdırılmış dict quraşdırılacaq.

Yaxşı xəbərdir, belə ki, köçürülmüş Python v3.6 + dict dəyərləri kimi düymələri və rəqəmli dəyərlər şəklində unikal simli identifikatorları olan bir verilənlər bazasından əldə edilən OP kartlarının istifadəçisinin orijinal nümunəsi artıq yerləşdirmə qaydasına hörmət göstərməlidir.

Bir verilənlər bazası sorğusundan iki sütun cədvəl ifadəsi nəticəsində, məsələn:

 SELECT a_key, a_value FROM a_table ORDER BY a_value; 

iki ədəd Python tuples, k_seq və v_seq (bir ədədi endeks və eyni kurs uzunluğu ilə hizalanacaq) saxlanılır, sonra:

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

Daha sonra çıxışa icazə verin:

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

bu vəziyyətdə (yeni quraşdırılmış dil Python 3.6+!):

 foo 0 bar 1 baz 42 

eyni qaydada v.

Mənim cihazım Python 3.5-də quraşdırılmış yerdə hazırda verir:

 bar 1 foo 0 baz 42 

Ətraflı:

2012-ci ildə Raymond Hettinger tərəfindən təklif edilən " Python-dev " mövzusuna "Python -dev " mövzusunda "Python -dev " mövzusunda Viktor Stiner tərəfindən yazılmış bir məktubda " ( daha sürətli yineleyə ilə daha kompakt lüğətlər" mövzusuna baxın) və indi (2016-cı ildə baxın) Python 3.6 dict kompakt olur və fərdi versiyasını alır və " Python 3.6-da 27350 " Kompakt və sifarişli diktaturalar " probleminin düzəldilməsi / həyata keçirilməsi səbəbindən " əlavə sifariş qaydasını saxlamaq üçün daxili dictanı istifadə edə bilərsiniz!

İnşallah bu, ilk addım olaraq, OrderedDict in nazik qatının tətbiqinə gətirib çıxaracaq. @ JimFasarakis-Hilliard tərəfindən qeyd edildiyi kimi, bəziləri gələcəkdə OrderedDict növündən istifadə etmək hallarını da görürlər. Hesab edirəm ki, Python cəmiyyəti bütövlükdə sınaqdan keçməyini və sonrakı addımların nə olacağını diqqətlə yoxlayacaq.

Variantları qaçırmamaq üçün, kodlaşdırma vərdişlərini yenidən nəzərdən keçirmə vaxtı sabit qaydada açın:

  • Keyword arguments və
  • (aralıq) dict storage

Birincisi, bəzi hallarda funksiyaların və üsulların həyata keçirilməsində göndərilməsini asanlaşdırır.

İkincisi, boru kəmərlərinin emalında ara saxlama kimi asanlıqla istifadə edilməsini tövsiyə edir.

Raymond Hettinger, " Python 3.6 lüğətlər arxasında Texnologiya " adlı sənədlərini xahiş etdi - San Francisco Python Meetup Group təqdimatından 2016-DEC-08.

Və bəlkə də bəzi yüksək qətnamə səhifələr və on123.ru sualları bu məlumatın dəyişməsini əldə edəcək və bir çox yüksək keyfiyyətli cavablar hər bir versiya üçün yeniləmələri tələb edəcəkdir.

Caveat Emptor (həm də aşağıda yenilənmə 2017-12-15 bax):

@Ajcr haqlı olaraq qeyd edir: "Bu yeni tətbiqin həyata keçirilməsinin üstünlüyü bir tətbiq təfərrüatı kimi qəbul edilir və ona əməl olunmur". ( whatsnew36- dan) nit toplama deyil , lakin kotirovka bir az pessimist ;-) kəsildi. Bu davam edir "(bu gələcəkdə dəyişə bilər, amma dictin bu yeni tətbiqi bütün mövcud və gələcək Python tətbiqləri üçün sifarişin saxlanılması üçün zəruri semantik dil təfərrüatı dəyişməzdən əvvəl bir neçə relizlər üçün bir dildə olması arzu edilməlidir, bu da köhnə versiyaları ilə geri uyğunluq saxlamağa kömək edir yinelemelerin təsadüfi qaydası hələ də qüvvədə olduğu dil, məsələn, Python 3.5).

Belə ki, bəzi insan dillərində olduğu kimi (məsələn, Alman dilində) istifadə dil yaradır və indi iradə elan ediləcəkdir ... whatsnew36 .

2017-12-15 yeniləmə:

Guido van Rossum, python-dev siyahısına göndərdiyi məktubda belə deyir:

Bunu etməyin. "Dict sərəncamını saxlayır" həllidir. Təşəkkür edirik

Beləliklə, CPython'un 3.6 versiyası, dict'in yerləşdirilməsini sifariş etməkdə yan təsir, indi dil tərifinin bir hissəsi olur (yalnız bir tətbiq təfərrüatı deyil). Bu poçt akışı həmçinin, collections.OrderedDict üçün bəzi fərqli dizayn məqsədlərini ortaya qoymuşdur collections.OrderedDict Raymond Hettinger müzakirə zamanı xatırladı.

54
10 сент. Cavab Dilettant 10 Sentyabr verilir. 2016-09-10 13:05 '16 saat 13:05 'da 2016-09-10 13:05

Bu lüğət

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

Sırala

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

Nəticə

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

Lambda funksiyasını dəyərləri sıralamaq və onları bir dəyişəndə ​​saxlamaq üçün istifadə edə bilərsiniz.

Bu kömək edir!

41
25 янв. Cavab Bishop 25 jan verilir . 2016-01-25 17:54 '16 at 17:54 2016-01-25 17:54

Mənim də eyni problemim var idi və mən bunu aşağıdakı kimi həll etdim:

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

("İqtidarlığı düzəltmək mümkün deyil" cavabını verənlər sual oxuyurdu! Əslində, "Mən açarlara görə sıralayıram, amma dəyərlərə görə necə sıralayım?" Aydındır ki, o, onların mənaları ilə sıralanan bir düymələrin siyahısını istəyir .)

Sifarın müəyyən edilmədiyini unutmayın (eyni dəyəri olan düymələr çıxışı siyahısında rast gəlinir).

37
18 нояб. jimifiki tərəfindən verilən cavab 18 noyabr 2010-11-18 17:19 '10 at 17:19 2010-11-18 17:19

Python 2.7-də, sadəcə olaraq:

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

Enjoy; -)

31
22 авг. Cavab şirindream 22 aug verilir . 2013-08-22 11:38 '13 at 11:38 2013-08-22 11:38

Bu kod:

 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 

Aşağıdakı nəticələr:

Orijinal

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

Dərəcə

 {'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 Cavab PedroMorgan tərəfindən verilir 8 Mart 'da 5:06 2011-03-08 05:06

Qiymətlər sayısal olarsa, koleksiyonlardan bir sayaç da istifadə edə bilərsiniz.

 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 Cavab İvan Sas tərəfindən 27 İyun 2012 tarixində saat 18: 43-də verilir. 2012-06-27 18:43

Texniki olaraq, lüğətlər ardıcıllıq deyil və buna görə sıralana bilməz. Kimi bir şey edə bilərsiniz

 sorted(a_dictionary.values()) 

Performansı fərz etmə böyük bir şey deyil.

20
05 марта '09 в 3:56 2009-03-05 03:56 Cavab Hank Gay tərəfindən mart 05'09 3:56 2009-03-05 03:56 tərəfindən verilir

Siz də "ters çevrilmiş indeks" yarada bilərsiniz

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

İndi tərs məsələləriniz; hər bir dəyər müvafiq düymələrin siyahısı var.

 for k in sorted(inverse): print k, inverse[k] 
18
05 марта '09 в 4:52 2009-03-05 04:52 Cavab S.Lott tərəfindən verilir 05.03 'da 04:52 ' da, 2009-03-05 04:52

Aşağıdakı yanaşma cəhd edin. Aşağıdakı məlumatlarla mydict adlı bir lüğət müəyyən edin:

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

Sözlükləri açar sözlər ilə sıralamaq istəsəniz, aşağıdakı kimi bir şey edə bilərsiniz:

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

Bu aşağıdakı nəticəni geri qaytarmalıdır:

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

Digər tərəfdən, sözün dəyərini dəyərləndirmək lazımdır (soruşulan sual kimi), siz aşağıdakıları edə bilərsiniz:

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

Bu əmrin nəticəsi (lüğətə dəyər verilməsi) aşağıdakıları qaytarmalıdır:

 bob: 1 alan: 2 danny: 3 carl: 40 
18
07 апр. Cavab Nathaniel Payne tərəfindən verilir 07 Apr. 2014-04-07 07:46 '14 at 7:46 2014-04-07 07:46

Koleksiyonlardan istifadə edə bilərsiniz. Qeyd edək ki, bu ədədi və qeyri-ədədi dəyərlər üçün də işləyəcəkdir.

 >>> 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 Cavab Abhijit mart 09 '13 saat 15:30 'da verilir 2013-03-09 15:30

Söz ən yüksəkdən ən aşağı qiymətə görə sıralanan lüğətdə əsas dəyər cütlərinin siyahısını verir:

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

Anahtara görə sıralanan lüğət üçün aşağıdakıları istifadə edin:

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

Qayıdışlar bir sıra siyahıdır, çünki lüğətlər özləri sıralana bilməz.

Bu, çap edilə bilər və ya daha çox hesablamalar üçün göndərilə bilər.

15
12 февр. Zags cavab 12 fevral 2014-02-12 23:10 '14 'da 11:10 2014-02-12 23:10

Sürekli olaraq değerine göre sıralanan bir sözlük olan skip dict'i istifadə edə bilərsiniz.

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

keys() , values() və ya items() etsəniz, sıralanan əmrdən dəyərə keçir.

Datastrukturdakı keçidlər siyahısından istifadə etməklə həyata keçirilir.

14
26 сент. cavab cavabı verilir . 2014-09-26 01:56 '14 da 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 нояб. Cavab verildi Argun 01 noyabr. 2010-11-01 15:16 '10 at 15:16 'da 2010-11-01 15:16

Həm də düyməyə ötürülə bilən xüsusi funksiyadan istifadə edə bilərsiniz.

 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) 

Bunu etmək üçün başqa üsul labmda funksiyasından istifadə etməkdir.

 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 Cavab Vishwanath Rawat tərəfindən 25 May 'da 21:13 2017-05-25 21:13' də verilir

Burada d.values()d.keys() d.values() istifadə edən bir həlldir. Bu linki bir neçə satır (lüğət obyektlərində):

Bu, zip (): cüt = zip (d.values ​​(), d.keys ()) istifadə edərək, cütləri (dəyəri, açar) yaratmağa imkan verir.

Beləliklə, biz aşağıdakıları edə bilərik:

 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 Cavab Scott tərəfindən 20 iyun 'da 4:44' də verilir 2015-06-20 04:44

Diktsdən ValueSortedDict istifadə edin:

 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 окт. Cavab 19 oktyabrda verilir . 2011-10-19 09:25 '11 saat 09:25 'da 2011-10-19 09:25

Mən bu ilə gəldim

 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 üçün: x.items() əvəzinə iteritems() .

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

Və ya collections.OrderedDict istifadə edin!

 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 cümə axşamı octoback cavab verilir 08 may 2013 at 11:17 2013-05-08 11:17

Siz sıralanan Python funksiyasından istifadə edə bilərsiniz.

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

Belə ki, istifadə edə bilərsiniz:

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

Sıralanan funksiya haqqında daha ətraflı məlumat üçün bu linki izləyin: https://docs.python.org/2/library/functions.html#sorted

6
21 нояб. cavab kkk 21 nov verir. 2014-11-21 18:04 '14 at 18:04 2014-11-21 18:04

Dict tərəfindən döyülmə və dəyərləri ilə sıralanma azalan qaydada:

 $ 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 окт. 30 oktyabr cümə günü cavab verildi . 2011-10-30 22:42 '11 at 10:42 pm 2011-10-30 22:42

Əlbəttə ki, OrderedDict istifadə etmək lazımdır ki, müntəzəm Python lüğətlər orijinal qaydada qorumaq deyil.

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

Python 2.7 və ya daha yüksək olmasanız, ən yaxşı şey, generator funksiyasındaki dəyərlər üzərində təkrarlamaqdır. (Burada 2.4 və 2.6 üçün sifariş verilmişdir, lakin

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

və həmçinin

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

Hər bir dəyəri də çap edə bilərsiniz.

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

Python 3.0 və ya daha yüksək istifadə etmirsinizsə, çapdan sonra brackets aradan qaldırılması unutmayın.

6
31 июля '15 в 11:08 2015-07-31 11:08 Cavab ytpillai tərəfindən verilir 31 İyul '15 'də 11:08' də 2015-07-31 11:08

Dilettant qeyd etdiyimiz kimi , Python 3.6 indi əmri saxlayacaq! Mən yazdığım funksiyanı istifadə edəcəyini düşündüm, yəni təkrarlanmayı (tuple, list, dict) daha asanlaşdırdı. Sonuncu vəziyyətdə siz ya düymələrlə və ya dəyərlə sıralaya bilərsiniz və bu sayısal müqayisəni nəzərə ala bilər. Yalnız> = 3.6!

Məsələn, saxlanılan iteration ilə sıralamaqdan istifadə etməyə çalışdığınız zaman. strings, həmçinin sorted () ints uğursuz olacaq. Əlbəttə ki, string () ilə müqayisə edə bilərsiniz. Lakin, bəzi hallarda, 12 20 dən az olan faktiki ədədi müqayisə etmək istərdiniz (bu, dizgələri müqayisə etmədi). Buna görə də mən aşağıdakılarla gəldim. Açıq sayısal müqayisəyə ehtiyac num_as_num , num_as_num bayrağından istifadə edə bilərsiniz. Bu, açıq-aşkar kəmiyyət num_as_num yerinə yetirməyə cəhd edəcək, bütün dəyərləri dəyişməyə çevirir. Əgər bu uğurlu olarsa, ədədi bir sıra göstərəcəkdir, əks halda sətirləri müqayisə etmək üçün istifadə ediləcək.

Təkmilləşdirmə və ya təkan istəkləri üçün şərhlər qəbul edilir.

 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 Cavab Bram Vanroy tərəfindən 02 mart 18: 00-da 19:48 2018-03-02 19:48 tarixində verilir

dict və Python 2.7 və ya daha sonra istifadə edirsinizsə, collections.Counter istifadə edə bilərsiniz. dict yerinə dict . most_common metodu dəyər ilə sıralanan bütün elementləri verəcəkdir.

5
24 янв. Jan 24-də Petr Viktorin tərəfindən verilmiş cavab 2012-01-24 22:28 '12 at 10:28 pm 2012-01-24 22:28
  • 1
  • 2

haqqında suallar və ya bir sual