Kā sakārtot vārdnīcu pēc atslēgas?

Kāds būtu labs veids, kā no {2:3, 1:89, 4:5, 3:0} pāriet uz {1:89, 2:3, 3:0, 4:5}?
Es pārbaudīju dažus ziņojumus, bet visos tajos ir izmantots "sorted" operators, kas atgriež tuples.

Risinājums

Standarta Python vārdnīcas nav sakārtotas. Pat ja jūs sakārtotu (atslēga,vērtība) pārus, jūs nevarētu tos saglabāt dict tādā veidā, lai saglabātu sakārtojumu.

Visvienkāršākais veids ir izmantot OrderedDict, kas atceras, kādā secībā elementi ir ievietoti:

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

Nepievērsiet uzmanību tam, kā tiek izdrukāts od; tas darbosies, kā paredzēts:

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

Python 3 lietotājiem ir jāizmanto .items(), nevis .iteritems():

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5
Komentāri (14)

Pašām vārdnīcām kā tādām nav sakārtotu elementu, ja vēlaties tos izdrukāt utt., lai tos sakārtotu, šeit ir daži piemēri:

Python 2.4 un jaunākās versijās:

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

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

dod:

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

(Python zem 2.4:)

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

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

Komentāri (1)

Kā jau citi ir minējuši, vārdnīcas pēc būtības nav sakārtotas. Tomēr, ja runa ir tikai par vārdnīcu parādīšanu sakārtotā veidā, jūs varat pārtaisīt __str__ metodi vārdnīcas apakšklasē un izmantot šo vārdnīcu klasi, nevis iebūvēto dict. Piem.

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}

Ņemiet vērā, ka tas neko nemaina attiecībā uz to, kā atslēgas tiek saglabātas, kādā secībā tās atgriezīsies, kad tās iterēsiet utt., tikai to, kā tās tiks parādītas ar print vai python konsoles palīdzību.

Komentāri (0)