Jawaban:
Jawaban dasar:
mylist = ["b", "C", "A"]
mylist.sort()
Ini mengubah daftar asli Anda (yaitu mengurutkan di tempat). Untuk mendapatkan salinan daftar, tanpa mengubah yang asli, gunakan sorted()
fungsinya:
for x in sorted(mylist):
print x
Namun, contoh di atas agak naif, karena mereka tidak memperhitungkan lokal, dan melakukan penyortiran peka huruf besar-kecil. Anda dapat memanfaatkan parameter opsional key
untuk menentukan urutan penyortiran khusus (alternatif, menggunakan cmp
, adalah solusi yang sudah tidak digunakan lagi, karena harus dievaluasi beberapa kali - key
hanya dihitung sekali per elemen).
Jadi, untuk mengurutkan berdasarkan lokal saat ini, dengan mempertimbangkan aturan khusus bahasa ( cmp_to_key
adalah fungsi pembantu dari functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
Dan akhirnya, jika perlu, Anda dapat menentukan lokal kustom untuk menyortir:
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']
Catatan terakhir: Anda akan melihat contoh penyortiran case-insensitive yang menggunakan lower()
metode - itu tidak benar, karena mereka hanya bekerja untuk subset karakter ASCII. Keduanya salah untuk data non-Inggris:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
mylist.sort(key=str.lower)
lebih cepat.
[1, 2, 3].sort()
. Saat sort()
mengurutkan daftar pada tempatnya (yaitu, mengubah daftar secara langsung), itu tidak mengembalikan daftar yang diurutkan, dan sebenarnya tidak mengembalikan apa pun, sehingga laporan cetak Anda dicetak None
. Jika Anda menyimpan daftar Anda ke variabel, katakanlah x
, dipanggil x.sort()
, maka print(x)
, Anda akan melihat daftar yang diurutkan.
Juga perlu diperhatikan sorted()
fungsinya:
for x in sorted(list):
print x
Ini mengembalikan versi daftar yang baru diurutkan tanpa mengubah daftar aslinya.
Cara yang tepat untuk mengurutkan string adalah:
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']
Contoh sebelumnya mylist.sort(key=lambda x: x.lower())
akan berfungsi dengan baik untuk konteks hanya ASCII.
Silakan gunakan fungsi yang diurutkan () dalam Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Tetapi bagaimana ini menangani aturan penyortiran khusus bahasa? Apakah ini memperhitungkan lokal?
Tidak, list.sort()
adalah fungsi penyortiran generik. Jika Anda ingin mengurutkan berdasarkan aturan Unicode, Anda harus menentukan fungsi tombol pengurutan khusus. Anda dapat mencoba menggunakan modul pyuca , tapi saya tidak tahu seberapa lengkapnya.
Pertanyaan lama, tetapi jika Anda ingin melakukan penyortiran sadar-lokal tanpa pengaturan locale.LC_ALL
Anda dapat melakukannya dengan menggunakan pustaka PyICU seperti yang disarankan oleh jawaban ini :
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)
Kemudian panggil dengan mis:
new_list = sorted_strings(list_of_strings, "de_DE.utf8")
Ini bekerja untuk saya tanpa menginstal lokal atau mengubah pengaturan sistem lainnya.
(Ini sudah disarankan dalam komentar di atas , tetapi saya ingin membuatnya lebih menonjol, karena pada awalnya saya merindukannya.)
Atau mungkin:
names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Sederhana: https://trinket.io/library/trinkets/5db81676e4
scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'
skor = skor.split (',') untuk x diurutkan (skor): cetak (x)
locale
dan metode string collation untuk mengurutkan secara alami sesuai dengan lokal saat ini.