Ποιος είναι ο καλύτερος τρόπος για τη δημιουργία μιας αλφαβητικά ταξινομημένης λίστας στην Python;
Βασική απάντηση:
mylist = ["b", "C", "A"]
mylist.sort()
Αυτό τροποποιεί την αρχική σας λίστα (δηλ. ταξινομεί στη θέση της). Για να λάβετε ένα ταξινομημένο αντίγραφο της λίστας, χωρίς να αλλάξετε την αρχική, χρησιμοποιήστε τη συνάρτηση sorted()
:
for x in sorted(mylist):
print x
Ωστόσο, τα παραπάνω παραδείγματα είναι λίγο αφελή, επειδή δεν λαμβάνουν υπόψη την τοπική γλώσσα και εκτελούν ταξινόμηση με βάση την πεζότητα. Μπορείτε να επωφεληθείτε από την προαιρετική παράμετρο key
για να καθορίσετε προσαρμοσμένη σειρά ταξινόμησης (η εναλλακτική λύση, η χρήση του cmp
, είναι μια απαρχαιωμένη λύση, καθώς πρέπει να αξιολογηθεί πολλές φορές - το key
υπολογίζεται μόνο μία φορά ανά στοιχείο).
Έτσι, για την ταξινόμηση σύμφωνα με την τρέχουσα τοπική γλώσσα, λαμβάνοντας υπόψη τους ειδικούς για τη γλώσσα κανόνες (cmp_to_key
είναι μια βοηθητική συνάρτηση από το functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
Και τέλος, αν χρειάζεται, μπορείτε να καθορίσετε μια προσαρμοσμένη τοπική γλώσσα για την ταξινόμηση:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad']
Τελευταία σημείωση: θα δείτε παραδείγματα ταξινόμησης χωρίς διαφορά πεζών-κεφαλαίων που χρησιμοποιούν τη μέθοδο lower()
- αυτά είναι λανθασμένα, επειδή λειτουργούν μόνο για το υποσύνολο χαρακτήρων ASCII. Αυτά τα δύο είναι λανθασμένα για οποιαδήποτε μη-αγγλικά δεδομένα:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Αλλά πώς αυτό χειρίζεται τους κανόνες ταξινόμησης για συγκεκριμένες γλώσσες; Λαμβάνει υπόψη την τοπική γλώσσα;
Όχι, η list.sort()
είναι μια γενική συνάρτηση ταξινόμησης. Αν θέλετε να ταξινομήσετε σύμφωνα με τους κανόνες Unicode, θα πρέπει να ορίσετε μια προσαρμοσμένη συνάρτηση κλειδιού ταξινόμησης. Μπορείτε να δοκιμάσετε να χρησιμοποιήσετε την ενότητα pyuca, αλλά δεν ξέρω πόσο πλήρης είναι.