Gunakan localedan metode string collation untuk mengurutkan secara alami sesuai dengan lokal saat ini.
u0b34a0f6ae
Jawaban:
519
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 keyuntuk menentukan urutan penyortiran khusus (alternatif, menggunakan cmp, adalah solusi yang sudah tidak digunakan lagi, karena harus dievaluasi beberapa kali - keyhanya dihitung sekali per elemen).
Jadi, untuk mengurutkan berdasarkan lokal saat ini, dengan mempertimbangkan aturan khusus bahasa ( cmp_to_keyadalah 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/localeassert 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)
Poin yang bagus. Saya akan meninggalkan contoh saya sekarang apa adanya, karena mungkin lebih mudah bagi pemula untuk melihat apa yang terjadi, tetapi saya akan mengingatnya di masa depan.
Eli Courtwright
1
Jika ada yang penasaran, kinerja list.sort () dapat ditemukan di sini
Hari Ganesan
1
@BornToCode: 1- Saya tahu . Lihatlah revisi (2008) yang saya balas (komentar saya adalah tentang penggunaan lambda yang tidak perlu). 2- menyortir karakter non-ASCII adalah topik terpisah yang besar. PyICU dapat digunakan sebagai pengganti solusi berbasis lokal.
jfs
1
@Dmitry Ini karena Anda mencetak nilai balik dari fungsi sortir yang dipanggil [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.
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert 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.
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 pengaturanlocale.LC_ALL Anda dapat melakukannya dengan menggunakan pustaka PyICU seperti yang disarankan oleh jawaban ini :
names =['Jasmine','Alberto','Ross','dig-dog']print("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
locale
dan metode string collation untuk mengurutkan secara alami sesuai dengan lokal saat ini.Jawaban:
Jawaban dasar:
Ini mengubah daftar asli Anda (yaitu mengurutkan di tempat). Untuk mendapatkan salinan daftar, tanpa mengubah yang asli, gunakan
sorted()
fungsinya: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, menggunakancmp
, 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):Dan akhirnya, jika perlu, Anda dapat menentukan lokal kustom untuk menyortir:
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:sumber
mylist.sort(key=str.lower)
lebih cepat.[1, 2, 3].sort()
. Saatsort()
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 dicetakNone
. Jika Anda menyimpan daftar Anda ke variabel, katakanlahx
, dipanggilx.sort()
, makaprint(x)
, Anda akan melihat daftar yang diurutkan.Juga perlu diperhatikan
sorted()
fungsinya:Ini mengembalikan versi daftar yang baru diurutkan tanpa mengubah daftar aslinya.
sumber
Sesederhana itu :)
sumber
Cara yang tepat untuk mengurutkan string adalah:
Contoh sebelumnya
mylist.sort(key=lambda x: x.lower())
akan berfungsi dengan baik untuk konteks hanya ASCII.sumber
Silakan gunakan fungsi yang diurutkan () dalam Python3
sumber
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.sumber
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 :Kemudian panggil dengan mis:
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.)
sumber
Seharusnya
s = "ZWzaAd"
Untuk mengurutkan string di atas, solusi sederhana akan berada di bawah satu.
sumber
sumber
Hasil
sumber
Sederhana: https://trinket.io/library/trinkets/5db81676e4
skor = skor.split (',') untuk x diurutkan (skor): cetak (x)
sumber