Di Python 2.x , saya bisa meneruskan fungsi kustom ke fungsi sortir dan .sort
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Karena, dalam bahasa saya , konsonan hadir dengan urutan ini
"k","kh",....,"ht",..."h",...,"a"
Tapi di Python 3.x , sepertinya saya tidak bisa memasukkan cmp
kata kunci
>>> sorted(x,cmp=customsort)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'cmp' is an invalid keyword argument for this function
Apakah ada alternatif atau haruskah saya menulis fungsi yang diurutkan sendiri juga?
Catatan: Saya menyederhanakan dengan menggunakan "k", "kh", dll. Karakter sebenarnya adalah Unicodes dan bahkan lebih rumit, kadang-kadang ada huruf vokal muncul sebelum dan sesudah konsonan, saya telah melakukan fungsi perbandingan kustom, Jadi bagian itu ok. Hanya masalahnya adalah saya tidak bisa meneruskan fungsi perbandingan kustom saya ke sort atau .sort
python
sorting
python-3.x
KAMU
sumber
sumber
sorted(x)
?Jawaban:
Gunakan
key
argumen (dan ikuti resep tentang cara mengubahcmp
fungsi lama Anda menjadikey
fungsi).functools
memiliki fungsi yangcmp_to_key
disebutkan di docs.python.org/3.6/library/functools.html#functools.cmp_to_keysumber
< > =
ke perantara, karena jenis kustom asli saya ditulis dalam C, kecepatannya sekitar 1 / 2x urutan default.timeit
itusorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)
memberikan TypeError: 'cmp' adalah argumen kata kunci yang tidak valid untuk fungsi ini, dengan Python 3.2 :(Gunakan
key
kata kunci dan functools.cmp_to_key untuk mengubah fungsi perbandingan Anda:sumber
Alih-alih customort (), Anda memerlukan fungsi yang menerjemahkan setiap kata menjadi sesuatu yang Python sudah tahu cara mengurutkan. Misalnya, Anda dapat menerjemahkan setiap kata ke dalam daftar angka di mana setiap angka mewakili tempat setiap huruf muncul dalam alfabet Anda. Sesuatu seperti ini:
Karena bahasa Anda menyertakan huruf banyak karakter, fungsi custom_key Anda jelas harus lebih rumit. Itu seharusnya memberi Anda gambaran umum.
sumber
Contoh lambda python3 cmp_to_key lengkap:
bandingkan dengan penyortiran objek umum:
sumber
Saya tidak tahu apakah ini akan membantu, tetapi Anda dapat memeriksa
locale
modulnya. Sepertinya Anda dapat menyetel lokal ke bahasa Anda dan menggunakannyalocale.strcoll
untuk membandingkan string menggunakan aturan pengurutan bahasa Anda.sumber
Gunakan
key
argumen sebagai gantinya. Dibutuhkan fungsi yang mengambil nilai yang sedang diproses dan mengembalikan satu nilai memberikan kunci untuk digunakan untuk mengurutkan.sumber
TypeError: customsort() takes exactly 2 positional arguments (1 given)