Πώς μπορώ να ταξινομήσω ένα λεξικό με βάση το κλειδί;

Ποιος θα ήταν ένας καλός τρόπος για να πάμε από το {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

Για τους χρήστες της Python 3, πρέπει να χρησιμοποιήσετε την .items() αντί της .iteritems():

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5
Σχόλια (14)

Τα ίδια τα λεξικά δεν έχουν διατεταγμένα στοιχεία ως τέτοια, αν θέλετε να τα εκτυπώσετε κ.λπ. σε κάποια σειρά, εδώ είναι μερικά παραδείγματα:

Στην 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/

Σχόλια (1)

Όπως έχουν αναφέρει και άλλοι, τα λεξικά είναι εγγενώς μη ταξινομημένα. Ωστόσο, αν το θέμα είναι απλώς η εμφάνιση των λεξικών με ταξινομημένο τρόπο, μπορείτε να υπερβείτε τη μέθοδο __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.

Σχόλια (0)