Πώς να ταξινομήσετε μια λίστα συμβολοσειρών;

Ποιος είναι ο καλύτερος τρόπος για τη δημιουργία μιας αλφαβητικά ταξινομημένης λίστας στην 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)
Σχόλια (8)
list.sort()

Είναι πραγματικά τόσο απλό :)

Σχόλια (0)

Αλλά πώς αυτό χειρίζεται τους κανόνες ταξινόμησης για συγκεκριμένες γλώσσες; Λαμβάνει υπόψη την τοπική γλώσσα;

Όχι, η list.sort() είναι μια γενική συνάρτηση ταξινόμησης. Αν θέλετε να ταξινομήσετε σύμφωνα με τους κανόνες Unicode, θα πρέπει να ορίσετε μια προσαρμοσμένη συνάρτηση κλειδιού ταξινόμησης. Μπορείτε να δοκιμάσετε να χρησιμοποιήσετε την ενότητα pyuca, αλλά δεν ξέρω πόσο πλήρης είναι.

Σχόλια (0)