Ποιος θα ήταν ένας καλός τρόπος για να πάμε από το {2:3, 1:89, 4:5, 3:0}
στο {1:89, 2:3, 3:0, 4:5}
;
Έλεγξα κάποιες αναρτήσεις αλλά όλες χρησιμοποιούν τον τελεστή "sorted" που επιστρέφει πλειάδες.
Τα τυπικά λεξικά της Python είναι μη ταξινομημένα. Ακόμα και αν ταξινομήσετε τα ζεύγη (κλειδί,τιμή), δεν θα μπορούσατε να τα αποθηκεύσετε σε ένα dict
με τρόπο που θα διατηρούσε την ταξινόμηση.
Ο ευκολότερος τρόπος είναι να χρησιμοποιήσετε το OrderedDict
, το οποίο θυμάται τη σειρά με την οποία έχουν εισαχθεί τα στοιχεία:
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)])
Μην ασχολείστε με τον τρόπο με τον οποίο εκτυπώνεται το od
- θα λειτουργήσει όπως αναμενόταν:
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, πρέπει να χρησιμοποιήσετε την .items()
αντί της .iteritems()
:
In [13]: for k, v in od.items(): print(k, v)
....:
1 89
2 3
3 0
4 5
Τα ίδια τα λεξικά δεν έχουν διατεταγμένα στοιχεία ως τέτοια, αν θέλετε να τα εκτυπώσετε κ.λπ. σε κάποια σειρά, εδώ είναι μερικά παραδείγματα:
Στην Python 2.4 και πάνω:
mydict = {'carl':40,
'alan':2,
'bob':1,
'danny':3}
for key in sorted(mydict):
print "%s: %s" % (key, mydict[key])
δίνει:
alan: 2
bob: 1
carl: 40
danny: 3
(Python κάτω από 2.4:)
keylist = mydict.keys()
keylist.sort()
for key in keylist:
print "%s: %s" % (key, mydict[key])
Πηγή: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
Όπως έχουν αναφέρει και άλλοι, τα λεξικά είναι εγγενώς μη ταξινομημένα. Ωστόσο, αν το θέμα είναι απλώς η εμφάνιση των λεξικών με ταξινομημένο τρόπο, μπορείτε να υπερβείτε τη μέθοδο __str__
σε μια υποκλάση λεξικού και να χρησιμοποιήσετε αυτή την κλάση λεξικού αντί για την ενσωματωμένη dict
. Πχ.
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}
Σημειώστε, αυτό δεν αλλάζει τίποτα σχετικά με τον τρόπο αποθήκευσης των κλειδιών, τη σειρά με την οποία θα επανέλθουν όταν τα επαναλαμβάνετε κ.λπ., απλά τον τρόπο με τον οποίο εμφανίζονται με την print
ή στην κονσόλα της python.