Kaip būtų galima pereiti nuo {2:3, 1:89, 4:5, 3:0}
prie {1:89, 2:3, 3:0, 4:5}
?
Patikrinau keletą pranešimų, bet visuose juose naudojamas operatorius "sorted", kuris grąžina tuples.
Standartiniai "Python" žodynai yra netvarkingi. Net jei surūšiuotumėte (raktas,reikšmė) poras, negalėtumėte jų saugoti dikte
taip, kad išliktų eiliškumas.
Paprasčiausias būdas - naudoti OrderedDict
, kuris įsimena 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)])
Nekreipkite dėmesio į tai, kaip atspausdintas od
; viskas veiks, kaip ir 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 vartotojams reikia naudoti .items()
, o ne .iteritems()
:
In [13]: for k, v in od.items(): print(k, v)
....:
1 89
2 3
3 0
4 5
Patys žodynai neturi užsakytų elementų, jei norite juos spausdinti ir pan. tam tikra tvarka, štai keletas 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/
Kaip jau minėjo kiti, žodynai iš esmės yra netvarkingi. Tačiau, jei problema yra tik žodyno rodymas tvarkingai, galite pakeisti __str__
metodą žodyno poklasyje ir naudoti šią žodyno klasę, o ne standartinį dict
. Pvz.
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, kokia tvarka jie grįš, kai juos iteruosite ir t. t., tik tai, kaip jie atvaizduojami naudojant print
arba python konsolėje.