Wat zou een mooie manier zijn om van {2:3, 1:89, 4:5, 3:0}
naar {1:89, 2:3, 3:0, 4:5}
te gaan?
Ik heb wat posts bekeken maar ze gebruiken allemaal de "sorted" operator die tupels retourneert.
Standaard Python woordenboeken zijn niet geordend. Zelfs als je de (sleutel,waarde) paren zou sorteren, zou je niet in staat zijn om ze op te slaan in een dict
op een manier die de volgorde zou behouden.
De gemakkelijkste manier is om OrderedDict
te gebruiken, die de volgorde onthoudt waarin de elementen zijn ingevoegd:
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)])
Let niet op de manier waarop od
wordt afgedrukt; het'zal werken zoals verwacht:
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
Voor Python 3 gebruikers, moet men de .items()
in plaats van .iteritems()
gebruiken:
In [13]: for k, v in od.items(): print(k, v)
....:
1 89
2 3
3 0
4 5
Woordenboeken zelf hebben geen geordende items als zodanig, mocht u ze willen afdrukken enz. in enige volgorde, dan zijn hier enkele voorbeelden:
In Python 2.4 en hoger:
mydict = {'carl':40,
'alan':2,
'bob':1,
'danny':3}
for key in sorted(mydict):
print "%s: %s" % (key, mydict[key])
geeft:
alan: 2
bob: 1
carl: 40
danny: 3
(Python onder 2.4:)
keylist = mydict.keys()
keylist.sort()
for key in keylist:
print "%s: %s" % (key, mydict[key])
Bron: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
Zoals anderen al zeiden, woordenboeken zijn inherent ongeordend. Echter, als het alleen gaat om het geordend weergeven** van woordenboeken, dan kun je de __str__
methode in een subklasse van een woordenboek overriden, en deze woordenboek klasse gebruiken in plaats van de ingebouwde dict
. Bijv.
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}
Let op, dit verandert niets aan hoe de sleutels worden opgeslagen, de volgorde waarin ze terugkomen als je er overheen itereert etc, alleen hoe ze'worden weergegeven met print
of op de python console.