Saya refactoring beberapa kode lama saya dan menemukan ini:
alist.sort(cmp_items)
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
Kode berfungsi (dan saya menulisnya sekitar 3 tahun yang lalu!) Tetapi saya tidak dapat menemukan hal ini didokumentasikan di mana pun di dokumen Python dan semua orang menggunakannya sorted()
untuk mengimplementasikan penyortiran khusus. Adakah yang bisa menjelaskan mengapa ini berhasil?
sorted()
dansort()
menawarkan pengurutan khusus dengan cara yang hampir sama, modulo perbedaan dalam konvensi panggilan.key
parameter lebih disukai daripada meneruskancmp
fungsi. (Nanti bahkan tidak diimplementasikan dalam Python 3)foo
, jika tidak maka akan meledak. Lebih baik menentukan__lt__()
metode kustom untuk kelas Anda, kemudiansorted()
danlist.sort()
akan bekerja di luar kotak. (Btw, objek tidak perlu lagi didefinisikan__cmp__()
, cukup__lt__()
. Lihat iniJawaban:
Itu didokumentasikan di sini .
sumber
cmp
, saya mendapatkanTypeError: 'cmp' is an invalid keyword argument for this function
. Apa yang terjadi disini?sort
tidak mengambil fungsi perbandingan sebagai argumen di Python 3, dan bukan sebagai sesuatu yang sebenarnya ingin saya lakukan.Sebagai catatan tambahan, berikut adalah alternatif yang lebih baik untuk menerapkan penyortiran yang sama:
alist.sort(key=lambda x: x.foo)
Atau sebagai alternatif:
import operator alist.sort(key=operator.attrgetter('foo'))
Lihat Cara Menyortir , ini sangat berguna.
sumber
Seperti contoh ini. Anda ingin mengurutkan daftar ini.
[('c', 2), ('b', 2), ('a', 3)]
keluaran:
[('a', 3), ('b', 2), ('c', 2)]
Anda harus mengurutkan tupel berdasarkan item kedua, lalu yang pertama:
def letter_cmp(a, b): if a[1] > b[1]: return -1 elif a[1] == b[1]: if a[0] > b[0]: return 1 else: return -1 else: return 1
Kemudian ubah menjadi fungsi kunci:
from functools import cmp_to_key letter_cmp_key = cmp_to_key(letter_cmp))
Sekarang Anda dapat menggunakan tata urutan kustom Anda:
[('c', 2), ('b', 2), ('a', 3)].sort(key=letter_cmp_key)
sumber
Ini tidak berfungsi di Python 3.
Anda dapat menggunakan functools cmp_to_key agar fungsi perbandingan gaya lama berfungsi.
from functools import cmp_to_key def cmp_items(a, b): if a.foo > b.foo: return 1 elif a.foo == b.foo: return 0 else: return -1 cmp_items_py3 = cmp_to_key(cmp_items) alist.sort(cmp_items_py3)
sumber
Saya tahu banyak yang telah memposting beberapa jawaban yang bagus. Namun saya ingin menyarankan satu metode yang bagus dan mudah tanpa mengimpor perpustakaan apa pun.
l = [(2, 3), (3, 4), (2, 4)] l.sort(key = lambda x: (-x[0], -x[1]) ) print(l) l.sort(key = lambda x: (x[0], -x[1]) ) print(l)
Outputnya akan
[(3, 4), (2, 4), (2, 3)] [(2, 4), (2, 3), (3, 4)]
Outputnya akan diurutkan berdasarkan urutan parameter yang kami sediakan dalam format tuple
sumber
Bahkan lebih baik:
student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ] sorted(student_tuples, key=lambda student: student[2]) # sort by age [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Diambil dari: https://docs.python.org/3/howto/sorting.html
sumber