Ako môžem zoradiť slovník podľa kľúča?

Ako by bolo možné prejsť z {2:3, 1:89, 4:5, 3:0} na {1:89, 2:3, 3:0, 4:5}?
Pozrel som si niekoľko príspevkov, ale všetky používajú operátor "sorted", ktorý vracia tuples.

Riešenie

Štandardné slovníky jazyka Python sú neusporiadané. Aj keby ste dvojice (kľúč,hodnota) zoradili, nedokázali by ste ich uložiť do dict tak, aby sa zachovalo ich poradie.

Najjednoduchšie je použiť OrderedDict, ktorý si pamätá poradie, v akom boli prvky vložené:

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

Nevadí, že sa vypíše od; bude to fungovať podľa očakávania:

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

Pre používateľov Pythonu 3 je potrebné použiť .items() namiesto .iteritems():

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

Samotné slovníky nemajú usporiadané položky ako také, ak by ste ich chceli vytlačiť atď. podľa nejakého poradia, tu je niekoľko príkladov:

V jazyku Python 2.4 a vyššom:

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

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

dáva:

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

(Python pod 2.4:)

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

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

Komentáre (1)

Ako už spomenuli iní, slovníky sú vo svojej podstate neusporiadané. Ak však ide len o zobrazenie slovníkov usporiadaným spôsobom, môžete prepísať metódu __str__ v podtriede slovníka a použiť túto triedu slovníka namiesto zabudovaného dict. Napr.

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}

Všimnite si, že to nič nemení na spôsobe uloženia kľúčov, na poradí, v akom sa vrátia, keď nad nimi iterujete atď., len na spôsobe ich zobrazenia pomocou funkcie print alebo na konzole Pythonu.

Komentáre (0)