Jaki byłby ładny sposób na przejście z {2:3, 1:89, 4:5, 3:0}
do {1:89, 2:3, 3:0, 4:5}
?
Sprawdziłem kilka postów, ale wszystkie one używają operatora "sorted", który zwraca tuple.
Standardowe słowniki Pythona są nieuporządkowane. Nawet jeśli posortowałbyś pary (klucz,wartość), nie byłbyś w stanie przechowywać ich w dict
w sposób, który zachowałby kolejność.
Najprostszym sposobem jest użycie OrderedDict
, który zapamiętuje kolejność, w jakiej elementy zostały wstawione:
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)])
Nieważne, w jaki sposób od
jest wypisywane; będzie działać zgodnie z oczekiwaniami:
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
Dla użytkowników Pythona 3, należy użyć .items()
zamiast .iteritems()
:
In [13]: for k, v in od.items(): print(k, v)
....:
1 89
2 3
3 0
4 5
Słowniki same w sobie nie mają uporządkowanych elementów jako takich, gdybyś chciał je wydrukować itp. w jakimś porządku, oto kilka przykładów:
W Pythonie 2.4 i wyżej:
mydict = {'carl':40,
'alan':2,
'bob':1,
'danny':3}
for key in sorted(mydict):
print "%s: %s" % (key, mydict[key])
daje:
alan: 2
bob: 1
carl: 40
danny: 3
(Python poniżej 2.4:).
keylist = mydict.keys()
keylist.sort()
for key in keylist:
print "%s: %s" % (key, mydict[key])
Źródło: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
Jak już inni wspomnieli, słowniki są z natury nieuporządkowane. Jednakże, jeśli problemem jest tylko wyświetlanie słowników w uporządkowany sposób, możesz nadpisać metodę __str__
w podklasie słownika i użyć tej klasy słownika zamiast wbudowanego dict
. Na przykład.
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}
Uwaga, to nie zmienia nic o tym, jak klucze są przechowywane, w jakiej kolejności wrócą, gdy będziesz nad nimi iterować itp, tylko jak są wyświetlane za pomocą print
lub na konsoli pythona.