Kaip rūšiuoti žodyną pagal raktą?

Kas būtų geras būdas eiti nuo {2:3, 1:89, 4:5, 3:0} iki {1:89, 2:3, 3:0, 4:5} ?
Patikrinau keletą pranešimų, tačiau jie visi naudoja „rūšiuojamą“ operatorių, kuris grąžina numerius.

680
25 янв. nustatyti achrysochoou 25 sausis 2012-01-25 13:54 '12, 13:54, 2012-01-25 13:54
@ 25 atsakymai

Standartiniai „Python“ žodynai nereguliuojami. Net jei rūšiavote poras (raktas, vertė), jūs negalėjote jų išsaugoti dict taip, kad būtų tvarkinga.

Lengviausias būdas yra naudoti „ OrderedDict , kuri prisimena elementų įterpimo tvarką:

 In [1]: import collections In [2]: d = {2:3, 1:89, 4:5, 3:0} In [3]: od = collections.OrderedDict(sorted(d.items())) In [4]: od Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)]) 

Nepamirškite, kaip spausdinama; Jis veiks taip, kaip tikėtasi:

 In [11]: od[1] Out[11]: 89 In [12]: od[3] Out[12]: 0 In [13]: for k, v in od.iteritems(): print k, v ....: 1 89 2 3 3 0 4 5 

Python 3

Naudodami „Python 3“ naudotojus naudokite .items() vietoj .iteritems() :

 In [13]: for k, v in od.items(): print(k, v) ....: 1 89 2 3 3 0 4 5 
752
25 янв. Atsakymas duotas NPE sausio 25 d 2012-01-25 13:56 '12, 13:56, 2012-01-25 13:56

Patys žodynai neturi užsakytų elementų per se, jei norite juos spausdinti ir pan. tam tikra tvarka rasite keletą pavyzdžių:

Python 2.4 ir naujesnėse versijose:

 mydict = {'carl':40, 'alan':2, 'bob':1, 'danny':3} for key in sorted(mydict): print "%s: %s" % (key, mydict[key]) 

suteikia:

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

(Python žemiau 2,4 :)

 keylist = mydict.keys() keylist.sort() for key in keylist: print "%s: %s" % (key, mydict[key]) 

Šaltinis: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/

361
21 дек. atsakymas duotas James 21 Dec. 2012-12-21 16:01 '12 4:01 pm 2012-12-21 16:01

Iš „ Python“ collections bibliotekos dokumentacijos :

 >>> from collections import OrderedDict >>> # regular unsorted dictionary >>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} >>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works >>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) >>> # dictionary sorted by value >>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) >>> # dictionary sorted by length of the key string >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)]) 
173
03 марта '13 в 0:04 2013-03-03 00:04 atsakymas duotas Denniso kovo 03 d. 13 val. 0:04 2013-03-03 00:04

Labiausiai glaustas būdas, kuris nėra paminėtas nė viename iš kitų atsakymų, tikriausiai yra toks:

 >>> d = {2:3, 1:89, 4:5, 3:0} >>> dict(sorted(d.items())) {1: 89, 2: 3, 3: 0, 4: 5} 
41
30 окт. Atsakymas pateikiamas Dipu 30 oct. 2017-10-30 17:33 '17 17:33 2017-10-30 17:33

Yra keletas „Python“ modulių, kuriuose pateikiami žodynų diegimai, kurie automatiškai palaiko raktus surūšiuota tvarka. Apsvarstykite suskirstytų konteinerių modulį, kuris yra diegimas naudojant „Python“ ir „C-C“. Taip pat yra palyginimas su kitais populiariais pasirinkimais, palyginti su kitais.

Naudojant užsakytą diktavimą, yra nepakankamas sprendimas, jei reikia nuolat pridėti ir pašalinti raktų / verčių poras ir iteracijas.

 >>> from sortedcontainers import SortedDict >>> d = {2:3, 1:89, 4:5, 3:0} >>> s = SortedDict(d) >>> s.items() [(1, 89), (2, 3), (3, 0), (4, 5)] 

„SortedDict“ tipas taip pat palaiko indeksuotas vietovės apibrėžtis ir jų pašalinimą, kuris neįmanomas naudojant įmontuotą dict.

 >>> s.iloc[-1] 4 >>> del s.iloc[2] >>> s.keys() SortedSet([1, 2, 4]) 
35
28 марта '14 в 19:27 2014-03-28 19:27 atsakymą pateikė GrantJ, kovo 28 d., „14, 19:27, 2014-03-28 19:27

Tiesiog:

 d = {2:3, 1:89, 4:5, 3:0} sd = sorted(d.items()) for k,v in sd: print k, v 

Išvada:

 1 89 2 3 3 0 4 5 
24
13 нояб. Atsakymas, kurį pateikė vartotojo3769249 lapkritis 13 2015-11-13 00:28 '15 - 0:28 2015-11-13 00:28

Kaip jau minėta, žodynai iš esmės yra netinkami. Tačiau jei problema yra paprasčiausias žodynų rodymas tvarkingu būdu, galite pakeisti __str__ metodą žodyno poklasyje ir naudoti tą žodyną, o ne įmontuotą dict . Pavyzdžiui.

 class SortedDisplayDict(dict): def __str__(self): return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}" >>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0}) >>> d {1: 89, 2: 3, 3: 0, 4: 5} 

Atkreipkite dėmesį, kad tai nieko nekeičia, kaip saugomi raktai, kaip jie grąžinami, kai juos kartojate ir tt, tik tada, kai jie rodomi naudojant print arba python konsolę.

23
25 янв. Atsakė Brian Jan 25 2012-01-25 15:16 '12, 15:16, 2012-01-25 15:16

Rasta kitas būdas:

 import json print json.dumps(d, sort_keys = True) 

UPD:
1. ji taip pat rūšiuoja įdėtus objektus (dėka @DanielF).
2. „Python“ žodynai nereguliuojami, todėl galite naudoti jį spausdinti arba priskirti tik str.

15
13 марта '14 в 0:43 2014-03-13 00:43 atsakymas pateikiamas tschesseket kovo 13 d. 14 val. 0:43 2014-03-13 00:43

Python 3.

 >>> D1 = {2:3, 1:89, 4:5, 3:0} >>> for key in sorted(D1): print (key, D1[key]) 

suteikia

 1 89 2 3 3 0 4 5 
13
17 дек. Atsakymą pateikė Evgeny Tryastsin gruodžio 17 d. 2013-12-17 05:22 '13, 5:22, 2013-12-17 05:22

Čia rasta paprasčiausias sprendimas surūšiuoti python raktą su pprint . Pavyzdžiui.

 >>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99} >>> print x {'a': 10, 'b': 30, 'az': 99, 'cd': 20} 

bet naudojant pprint, jis grąžins rūšiuojamą diktą

 >>> import pprint >>> pprint.pprint(x) {'a': 10, 'az': 99, 'b': 30, 'cd': 20} 
9
03 февр. Atul Arvind atsakymas 03 vasaris 2014-02-03 14:11 '14 at 14:11 2014-02-03 14:11

„Python“ žodynas prieš Python 3.6 buvo neregistruotas. „Python 3.6“ CPython įgyvendinimo metu žodynas išsaugo įterpimo tvarką. Nuo „Python 3.7“ tai taps kalbos funkcija.

Jei norite rūšiuoti įdėtą diktą, kuriame yra viduje esantis diktatas, galite:

 test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}} def dict_reorder(item): return {k: sort_dict(v) if isinstance(v, dict) else v for k, v in sorted(item.items())} reordered_dict = dict_reorder(test_dict) 

https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb

7
08 янв. Guangyang Li atsakymas, pateiktas sausio 08 d 2018-01-08 20:34 '18, 8:34 pm 2018-01-08 20:34

Yra paprastas būdas rūšiuoti žodyną.

Pagal jūsų klausimą

Sprendimas:

 c={2:3, 1:89, 4:5, 3:0} y=sorted(c.items()) print y 

(kur c yra jūsų žodyno pavadinimas.)

Ši programa suteikia tokią išėjimą:

 [(1, 89), (2, 3), (3, 0), (4, 5)] 

kaip pageidaujama.

Kitas pavyzdys:

 d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41} x=sorted(d.keys()) print x 

Suteikia išvestį: ['Albert', 'Bill', 'John', 'Lucy', 'Peter']

 y=sorted(d.values()) print y 

Pateikia rezultatą: [18, 24, 32, 36, 41]

 z=sorted(d.items()) print z 

Suteikia išėjimą:

 [('Albert', 32), ('Bill', 41), ('John', 36), ('Lucy', 24), ('Peter', 18)] 

Todėl pakeisdami jį į raktus, vertes ir elementus, galite įvesti, kaip jums reikia. Tikiuosi, kad tai padės!

6
19 янв. Atsakyti Sree Jan 19 2017-01-19 07:29 '17 at 7:29 2017-01-19 07:29

Sukurs tiksliai tai, ko norite:

  D1 = {2:3, 1:89, 4:5, 3:0} sort_dic = {} for i in sorted(D1): sort_dic.update({i:D1[i]}) print sort_dic {1: 89, 2: 3, 3: 0, 4: 5} 

Tačiau tai nėra būdas rašyti, nes jis gali rodyti puikų elgesį su skirtingais žodynais, kuriuos sužinojau neseniai. Todėl, atsakydamas į mano prašymą, kurį čia dalinuosi, buvo pasiūlytas idealus kelias.

 from collections import OrderedDict sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0])) 
5
02 марта '17 в 14:20 2017-03-02 14:20 atsakymas duotas jax 02 kovo 17 d. 14:20 2017-03-02 14:20

Manau, kad lengviausia rūšiuoti dikto raktą ir išsaugoti surūšiuotą porą: vertę naujajame diktate.

 dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} dict2 = {} # create an empty dict to store the sorted values for key in sorted(dict1.keys()): if not key in dict2: # Depending on the goal, this line may not be neccessary dict2[key] = dict1[key] 

Kad jis būtų suprantamesnis:

 dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} dict2 = {} # create an empty dict to store the sorted values for key in sorted(dict1.keys()): if not key in dict2: # Depending on the goal, this line may not be neccessary value = dict1[key] dict2[key] = value 
4
14 марта '17 в 17:45 2017-03-14 17:45 atsakymas duotas lallolu kovo 14, 17, 17:45 2017-03-14 17:45

Python dicts nėra užsakomi. Tai paprastai nėra problema, nes dažniausiai naudojamas atvejis yra paieška.

Paprasčiausias būdas padaryti tai, ko norite, yra collections.OrderedDict kūrimas.

 ordered_dict = collections.OrderedDict([(k, d[k]) for k in sorted(d.keys())]) 

Jei jums reikia pakartoti tai, ką kiti pasiūlė aukščiau, paprasčiausias būdas būtų rūšiuoti rūšiuojamus raktus. Pavyzdžiai -

Spausdinimo reikšmės surūšiuotos pagal raktą:

 # create the dict d = {k1:v1, k2:v2,...} # iterate by keys in sorted order for k in sorted(d.keys()): value = d[k] # do something with k, value like print print k, value 

Gauti vertybių, surūšiuotų pagal raktus, sąrašą:

 values = [d[k] for k in sorted(d.keys())] 
4
28 марта '14 в 7:18 2014-03-28 07:18 atsakymą pateikė Ramashish Baranwal , kovo 28 d. 14 d., 07:18, 2014-03-28 07:18

Galite sukurti naują žodyną, rūšiuodami dabartinį žodyną raktu pagal jūsų klausimą.

Tai jūsų žodynas

 d = {2:3, 1:89, 4:5, 3:0} 

Sukurkite naują d1 žodyną, surūšiuodami jį naudodami lambda funkciją

 d1 = dict(sorted(d.items(), key = lambda x:x[0])) 

d1 turėtų būti {1: 89, 2: 3, 3: 0, 4: 5}, surūšiuoti pagal raktą d.

4
16 июня '18 в 12:14 2018-06-16 12:14 Atsakymą pateikė Amit Prafulla birželio 18 d. 18 val. 12.14 val. 2018-06-16 12:14
 dictionary = {1:[2],2:[],5:[4,5],4:[5],3:[1]} temp=sorted(dictionary) sorted_dict = dict([(k,dictionary[k]) for i,k in enumerate(temp)]) sorted_dict: {1: [2], 2: [], 3: [1], 4: [5], 5: [4, 5]} 
0
11 окт. Mahdi Ghelichi atsakymas spalio 11 d 2017-10-11 23:19 '17, 11:19 pm 2017-10-11 23:19

Kuriu vieną eilutę.

 >> a = {2:3, 1:89, 4:5, 3:0} >> c = {i:a[i] for i in dict.fromkeys(sorted([i for i in a]))} >> print(c) {1: 89, 2: 3, 3: 0, 4: 5} [Finished in 0.4s] 

Tikiuosi, kad tai naudinga.

0
13 дек. Jeevano Čaitanos atsakymas gruodžio 13 d 2018-12-13 08:31 '18 8:31 am 2018-12-13 08:31

Paprasčiausias sprendimas yra gauti diktuojančių raktų sąrašą, surūšiuotą pagal tvarką, o po to kartoti per diktą. Pavyzdžiui

 a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30} a1_sorted_keys = sorted(a1, key=a1.get, reverse=True) for r in a1_sorted_keys: print r, a1[r] 

Žemiau yra išvestis (laukimo tvarka)

 e 30 b 13 d 4 c 2 a 1 
0
26 янв. atsakymą Shafiq pateikė sausio 26 d. 2017-01-26 07:17 '17 at 7:17 2017-01-26 07:17
 from operator import itemgetter # if you would like to play with multiple dictionaries then here you go: # Three dictionaries that are composed of first name and last name. user = [ {'fname': 'Mo', 'lname': 'Mahjoub'}, {'fname': 'Abdo', 'lname': 'Al-hebashi'}, {'fname': 'Ali', 'lname': 'Muhammad'} ] # This loop will sort by the first and the last names. # notice that in a dictionary order doesn't matter. So it could put the first name first or the last name first. for k in sorted (user, key=itemgetter ('fname', 'lname')): print (k) # This one will sort by the first name only. for x in sorted (user, key=itemgetter ('fname')): print (x) 
0
25 нояб. Atsakymą pateikė Mohammad Mahjoub lapkričio 25 d. 2016-11-25 22:17 '16 at 10:17 pm 2016-11-25 22:17

Dviejų metodų laiko palyginimas nuo 2.7 rodo, kad jie yra beveik identiški:

 >>> setup_string = "a = sorted(dict({2:3, 1:89, 4:5, 3:0}).items())" >>> timeit.timeit(stmt="[(k, val) for k, val in a]", setup=setup_string, number=10000) 0.003599141953657181 >>> setup_string = "from collections import OrderedDict\n" >>> setup_string += "a = OrderedDict({1:89, 2:3, 3:0, 4:5})\n" >>> setup_string += "b = a.items()" >>> timeit.timeit(stmt="[(k, val) for k, val in b]", setup=setup_string, number=10000) 0.003581275490432745 
0
27 сент. Atsakymą pateikė Jesuisme, rugsėjo 27 d. 2016-09-27 02:59 '16 at 2:59 2016-09-27 02:59

Jūs vaikinai sunkiau ... tai tikrai lengva.

 from pprint import pprint Dict={'B':1,'A':2,'C':3} pprint(Dict) 

Išvada:

 {'A':2,'B':1,'C':3} 
0
15 сент. atsakymą pateikė Derick Fdo 2016-09-15 08:27 '16 at 8:27 pm 2016-09-15 08:27

Arba naudokite „ pandas

Demo versija:

 >>> d={'B':1,'A':2,'C':3} >>> df=pd.DataFrame(d,index=[0]).sort_index(axis=1) ABC 0 2 1 3 >>> df.to_dict('int')[0] {'A': 2, 'B': 1, 'C': 3} >>> 

Žr.

Šio dokumento dokumentai

Visų pandų dokumentavimas

0
17 окт. atsakymas pateikiamas U9-Forward 17 oct. 2018-10-17 09:42 '18 at 9:42 2018-10-17 09:42
 l = dict.keys() l2 = l l2.append(0) l3 = [] for repeater in range(0, len(l)): smallnum = float("inf") for listitem in l2: if listitem < smallnum: smallnum = listitem l2.remove(smallnum) l3.append(smallnum) l3.remove(0) l = l3 for listitem in l: print(listitem) 
-2
25 окт. atsakymas, kurį pateikė user7070507 Oct 25 2016-10-25 18:30 „16, 18:30, 2016-10-25 18:30

Jei turite diktuoti, pavyzdžiui:

 not_ordered_dict = {5 : "5555", 9 : "9999", 1 : "1111"} ordered_dict = {} for key in sorted(not_ordered_dict): ordered_dict[key] = not_ordered_dict[key] 
-7
17 мая '16 в 11:55 2016-05-17 11:55 atsakymas pateikiamas Lusine gegužės 17 d., 16 val. 11:55 2016-05-17 11:55

Kiti klausimai apie arba Užduoti klausimą