Πώς να ταξινομήσετε μια λίστα με τις χορδές;

ψήφοι
321

Ποιος είναι ο καλύτερος τρόπος για τη δημιουργία ενός αλφαβητικά ταξινομημένη λίστα στην Python;

Δημοσιεύθηκε 30/08/2008 στις 18:03
πηγή χρήστη
Σε άλλες γλώσσες...                            


10 απαντήσεις

ψήφοι
33
list.sort()

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

Απαντήθηκε 30/08/2008 στις 18:04
πηγή χρήστη

ψήφοι
413

Βασικές απάντηση:

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)
Απαντήθηκε 30/08/2008 στις 18:10
πηγή χρήστη

ψήφοι
10

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

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

Απαντήθηκε 30/08/2008 στις 19:10
πηγή χρήστη

ψήφοι
43

Αξίζει επίσης να σημειωθεί η sorted()λειτουργία:

for x in sorted(list):
    print x

Αυτό επιστρέφει μια νέα, ταξινόμηση έκδοση ενός καταλόγου χωρίς να αλλάξετε την αρχική λίστα.

Απαντήθηκε 30/08/2008 στις 23:14
πηγή χρήστη

ψήφοι
18

Ο σωστός τρόπος για να ταξινομήσετε τα strings είναι:

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'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad']

# Without using locale.strcoll you get:
assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad']

Το προηγούμενο παράδειγμα mylist.sort(key=lambda x: x.lower())θα λειτουργήσει το πρόστιμο για ASCII μόνο πλαίσια.

Απαντήθηκε 28/10/2009 στις 23:45
πηγή χρήστη

ψήφοι
1

Υποθέτω s = "ZWzaAd"

Για να ταξινομήσετε παραπάνω κλωστή η απλή λύση θα είναι κάτω από ένα.

print ''.join(sorted(s))
Απαντήθηκε 12/05/2017 στις 06:16
πηγή χρήστη

ψήφοι
4

Παρακαλούμε χρησιμοποιήστε ταξινόμηση () λειτουργία python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Απαντήθηκε 27/12/2017 στις 13:24
πηγή χρήστη

ψήφοι
0

Ή ίσως:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Απαντήθηκε 13/08/2018 στις 15:46
πηγή χρήστη

ψήφοι
0

Παλιά ερώτηση, αλλά αν θέλετε να κάνετε locale-επίγνωση διαλογής χωρίς να locale.LC_ALL μπορείτε να το κάνετε χρησιμοποιώντας τη βιβλιοθήκη PyICU όπως προτείνεται από αυτή την απάντηση :

import icu # PyICU

def sorted_strings(strings, locale=None):
    if locale is None:
       return sorted(strings)
    collator = icu.Collator.createInstance(icu.Locale(locale))
    return sorted(strings, key=collator.getSortKey)

Στη συνέχεια, καλέστε για παράδειγμα:

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

Αυτό λειτούργησε για μένα χωρίς να εγκαταστήσετε κανένα τοπικές ρυθμίσεις ή την αλλαγή άλλων ρυθμίσεων του συστήματος.

(Αυτό έχει ήδη προταθεί σε ένα σχόλιο παραπάνω , αλλά ήθελα να το δώσει μεγαλύτερη έμφαση, γιατί το έχασα τον εαυτό μου από την πρώτη.)

Απαντήθηκε 28/08/2019 στις 15:39
πηγή χρήστη

ψήφοι
0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Αποτέλεσμα

[ 'Abc', 'βα', 'cd', 'συνεχούς', 'xy']

Απαντήθηκε 07/12/2019 στις 10:21
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more