Saya punya daftar objek Python yang ingin saya urutkan berdasarkan atribut dari objek itu sendiri. Daftarnya seperti:
>>> ut
[<Tag: 128>, <Tag: 2008>, <Tag: <>, <Tag: actionscript>, <Tag: addresses>,
<Tag: aes>, <Tag: ajax> ...]
Setiap objek memiliki hitungan:
>>> ut[1].count
1L
Saya perlu mengurutkan daftar berdasarkan jumlah penghitungan yang menurun.
Saya telah melihat beberapa metode untuk ini, tetapi saya sedang mencari praktik terbaik dengan Python.
Jawaban:
Lebih lanjut tentang penyortiran berdasarkan kunci .
sumber
Cara yang bisa tercepat, terutama jika daftar Anda memiliki banyak catatan, adalah dengan menggunakannya
operator.attrgetter("count")
. Namun, ini mungkin berjalan pada versi pra-operator Python, jadi alangkah baiknya memiliki mekanisme mundur. Anda mungkin ingin melakukan hal berikut, kemudian:sumber
self.__dict__ = {'some':'dict'}
setelah__init__
metode). Saya tidak tahu mengapa itu bisa berbeda.__dict__
. Perhatikan bahwa "objek yang memiliki atribut yang ditambahkan secara dinamis" dan "pengaturan__dict__
atribut objek" adalah konsep yang hampir ortogonal. Saya mengatakan itu karena komentar Anda tampaknya menyiratkan bahwa menetapkan__dict__
atribut adalah persyaratan untuk menambahkan atribut secara dinamis.operator.attrgetter
, saya bisa menyediakan fungsi dengan nama properti apa pun dan mengembalikan koleksi yang diurutkan.Pembaca harus memperhatikan bahwa kunci = metode:
jauh lebih cepat daripada menambahkan operator perbandingan kaya ke objek. Saya terkejut membaca ini (halaman 485 "Python in a Nutshell"). Anda dapat mengonfirmasi ini dengan menjalankan tes pada program kecil ini:
Tes saya, sangat minimal, menunjukkan jenis pertama lebih dari 10 kali lebih lambat, tetapi buku itu mengatakan itu hanya sekitar 5 kali lebih lambat secara umum. Alasan mereka mengatakan ini karena algoritma pengurutan yang sangat optimal yang digunakan dalam python ( timsort ).
Namun, sangat aneh bahwa .sort (lambda) lebih cepat daripada .sort (). Saya harap mereka memperbaikinya.
sumber
__cmp__
sama dengan memanggil.sort(cmp=lambda)
, bukan.sort(key=lambda)
, jadi tidak aneh sama sekali.longList2.sort(cmp = cmp)
. Saya mencoba ini dan kinerjanya hampir sama.sort()
. (Juga: perhatikan bahwa parameter sortir "cmp" telah dihapus dengan Python 3.)Pendekatan berorientasi objek
Adalah praktik yang baik untuk membuat logika pemilahan objek, jika berlaku, properti kelas daripada dimasukkan dalam setiap contoh pemesanan diperlukan.
Ini memastikan konsistensi dan menghilangkan kebutuhan kode boilerplate.
Minimal, Anda harus menentukan
__eq__
dan__lt__
operasi agar ini berfungsi. Maka gunakan sajasorted(list_of_objects)
.sumber
__eq__
dan__lt__
apakah persyaratan implementasi minimum?•The sort routines are guaranteed to use __lt__() when making comparisons between two objects...
sumber
Ini terlihat seperti daftar contoh model ORM Django.
Mengapa tidak mengurutkannya pada permintaan seperti ini:
sumber
Tambahkan kaya operator perbandingan ke kelas objek, lalu gunakan metode sort () dari daftar.
Lihat perbandingan kaya dalam python .
Pembaruan : Meskipun metode ini akan berhasil, saya pikir solusi dari Triptych lebih cocok untuk kasus Anda karena cara yang lebih sederhana.
sumber
Jika atribut yang ingin Anda urutkan berdasarkan properti , maka Anda dapat menghindari mengimpor
operator.attrgetter
dan menggunakan metode propertifget
sebagai gantinya.Misalnya, untuk kelas
Circle
dengan propertiradius
kita bisa mengurutkan daftarcircles
berdasarkan jari-jari sebagai berikut:Ini bukan fitur yang paling terkenal tetapi sering menyelamatkan saya sejalan dengan impor.
sumber