Saya punya daftar daftar:
[[12, 'tall', 'blue', 1],
[2, 'short', 'red', 9],
[4, 'tall', 'blue', 13]]
Jika saya ingin mengurutkan berdasarkan satu elemen, katakan elemen tinggi / pendek, saya bisa melakukannya melalui s = sorted(s, key = itemgetter(1))
.
Jika saya ingin mengurutkan berdasarkan kedua tinggi / pendek dan warna, aku bisa melakukan semacam dua kali, sekali untuk setiap elemen, tetapi ada cara yang lebih cepat?
sort
. Yaitusorted([(4, 2), (0, 3), (0, 1)]) == [(0, 1), (0, 3), (4, 2)]
,.Jawaban:
Kunci dapat berupa fungsi yang mengembalikan tuple:
Atau Anda dapat mencapai penggunaan yang sama
itemgetter
(yang lebih cepat dan menghindari panggilan fungsi Python):Dan perhatikan bahwa di sini Anda dapat menggunakan
sort
alih-alih menggunakansorted
dan kemudian menetapkan kembali:sumber
-
bilangan bulat)revrse=True
hanya untukx[1]
itu mungkin?s = sorted(s, key = operator.itemgetter(2))
kemudian oleh primers = sorted(s, key = operator.itemgetter(1), reverse=True)
Tidak ideal, tetapi berfungsi.-1
.Saya tidak yakin apakah ini adalah metode yang paling pythonic ... Saya punya daftar tuple yang perlu disortir 1 dengan menurunkan nilai integer dan 2 menurut abjad. Ini diperlukan untuk membalikkan bilangan bulat bilangan tetapi bukan jenis abjad. Inilah solusi saya: (dengan cepat dalam ujian btw, saya bahkan tidak sadar Anda bisa 'menyortir' fungsi yang diurutkan)
sumber
b = sorted(a, key = lambda x: (-x[1], x[0]))
mana yang lebih terlihat pada kriteria mana yang lebih dulu. Adapun efisiensi saya tidak yakin, seseorang perlu mengatur waktu.Beberapa tahun terlambat ke pesta tapi saya ingin kedua semacam atas 2 kriteria dan penggunaan
reverse=True
. Jika ada orang lain yang ingin tahu caranya, Anda bisa membungkus kriteria Anda (fungsi) dalam tanda kurung:sumber
Tampaknya Anda dapat menggunakan
list
bukantuple
. Ini menjadi lebih penting saya pikir ketika Anda mengambil atribut daripada 'indeks ajaib' dari daftar / tuple.Dalam kasus saya, saya ingin mengurutkan berdasarkan beberapa atribut kelas, di mana kunci yang masuk adalah string. Saya membutuhkan pengurutan yang berbeda di tempat yang berbeda, dan saya ingin pengurutan standar umum untuk kelas induk yang berinteraksi dengan klien; hanya harus menimpa 'kunci penyortiran' ketika saya benar-benar 'perlu', tetapi juga dengan cara yang saya bisa menyimpannya sebagai daftar yang dapat dibagi kelas
Jadi pertama-tama saya mendefinisikan metode pembantu
lalu menggunakannya
Ini akan menggunakan fungsi lambda yang dihasilkan mengurutkan daftar dengan
object.attrA
danobject.attrB
dengan asumsiobject
memiliki pengambil sesuai dengan nama string yang disediakan. Dan kasus kedua akan beres padaobject.attrC
saat ituobject.attrA
.Ini juga memungkinkan Anda untuk mengekspos pilihan penyortiran luar untuk dibagikan sama oleh konsumen, tes unit, atau bagi mereka untuk memberi tahu Anda bagaimana mereka ingin penyortiran dilakukan untuk beberapa operasi di api Anda dengan hanya perlu memberi Anda daftar dan tidak menggabungkan mereka ke implementasi back end Anda.
sumber
Berikut ini salah satu caranya: Anda pada dasarnya menulis ulang fungsi sortir Anda untuk mengambil daftar fungsi sortir, setiap fungsi sortir membandingkan atribut yang ingin Anda uji, pada setiap tes sortir, Anda melihat dan melihat apakah fungsi cmp mengembalikan pengembalian yang bukan nol jika demikian pecahkan dan kirim nilai pengembalian. Anda menyebutnya dengan memanggil Lambda dari fungsi daftar Lambdas.
Keuntungannya adalah bahwa ia tidak melewati data bukan jenis yang sebelumnya seperti metode lainnya. Hal lain adalah bahwa itu di tempat, sedangkan diurutkan tampaknya membuat salinan.
Saya menggunakannya untuk menulis fungsi peringkat, yang memberi peringkat daftar kelas di mana setiap objek dalam sebuah kelompok dan memiliki fungsi skor, tetapi Anda dapat menambahkan daftar atribut apa pun. Perhatikan un-lambda-like, meskipun menggunakan lambda untuk memanggil setter. Bagian peringkat tidak akan berfungsi untuk array daftar, tetapi pengurutannya akan.
Berikut adalah cara untuk memberi peringkat daftar objek
sumber