Bagaimana cara mengurutkan daftar string?


417

Apa cara terbaik untuk membuat daftar yang diurutkan berdasarkan abjad dengan Python?


1
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/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)

37
mylist.sort(key=str.lower)lebih cepat.
jfs

1
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.
bjg222

56

Juga perlu diperhatikan sorted()fungsinya:

for x in sorted(list):
    print x

Ini mengembalikan versi daftar yang baru diurutkan tanpa mengubah daftar aslinya.



18

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.


13

Silakan gunakan fungsi yang diurutkan () dalam Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)

10

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.


1

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.)


0

Seharusnya s = "ZWzaAd"

Untuk mengurutkan string di atas, solusi sederhana akan berada di bawah satu.

print ''.join(sorted(s))

itu bukan daftar string yang Anda sortir di sini
mnl

0

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()))

0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Hasil

['abc', 'ba', 'cd', 'dc', 'xy']


0

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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.