Saya memiliki daftar berikut yang dibuat dari csv yang diurutkan
list1 = sorted(csv1, key=operator.itemgetter(1))
Saya sebenarnya ingin menyortir daftar dengan dua kriteria: pertama dengan nilai di bidang 1 dan kemudian dengan nilai di bidang 2. Bagaimana saya melakukan ini?
__lt__()
metode pada kelas Anda atau warisi dari beberapa kelas yang melakukannya" ? Itu akan membuatnya menjadi kanonik yang jauh lebih baik.Jawaban:
seperti ini:
sumber
operator
adalah modul yang perlu diimpor.Tidak perlu mengimpor apa pun saat menggunakan fungsi lambda.
Berikut ini diurutkan
list
menurut elemen pertama, kemudian oleh elemen kedua.sumber
-
in-x[1]
berdiri?Python memiliki jenis yang stabil, jadi asalkan kinerja bukan masalah, cara paling sederhana adalah mengurutkannya berdasarkan bidang 2 dan kemudian mengurutkannya lagi berdasarkan bidang 1.
Itu akan memberi Anda hasil yang Anda inginkan, satu-satunya hasil adalah bahwa jika itu adalah daftar besar (atau Anda ingin sering mengurutkannya) memanggil semacam dua kali mungkin overhead yang tidak dapat diterima.
Melakukannya dengan cara ini juga memudahkan untuk menangani situasi di mana Anda ingin beberapa kolom diurutkan mundur, cukup sertakan parameter 'reverse = True' bila perlu.
Jika tidak, Anda dapat meneruskan beberapa parameter ke itemgetter atau membuat tuple secara manual. Itu mungkin akan lebih cepat, tetapi memiliki masalah bahwa itu tidak menggeneralisasi dengan baik jika beberapa kolom ingin diurutkan terbalik (kolom numerik masih dapat dibalik dengan meniadakannya tetapi itu menghentikan pengurutan menjadi stabil).
Jadi jika Anda tidak memerlukan kolom yang disortir terbalik, pilih beberapa argumen untuk itemgetter, jika Anda mau, dan kolom tidak numerik atau Anda ingin menjaga penyortiran stabil untuk beberapa jenis berturut-turut.
Sunting: Untuk komentator yang memiliki masalah dalam memahami bagaimana ini menjawab pertanyaan asli, berikut adalah contoh yang menunjukkan dengan tepat bagaimana sifat stabil penyortiran memastikan kami dapat melakukan pengurutan terpisah pada setiap kunci dan berakhir dengan data yang diurutkan pada beberapa kriteria:
Ini adalah contoh runnable, tetapi untuk menyelamatkan orang yang menjalankannya, hasilnya adalah:
Perhatikan secara khusus bagaimana pada langkah kedua
reverse=True
parameter menjaga nama depan tetap berurutan sedangkan hanya mengurutkan lalu membalikkan daftar akan kehilangan urutan yang diinginkan untuk kunci pengurutan ketiga.sumber
sumber
tuple()
dapat menerima dua argumen (atau lebih tepatnya, tiga, jika Anda hitung denganself
)return
pernyataan harusreturn tuple((x[1], x[2]))
atau sederhanareturn x[1], x[2]
. Lihat @jaap jawaban di bawah ini jika Anda mencari pengurutan ke arah yang berbedatuple(x[1:3])
, jika Anda ingin menggunakan konstruktor tuple untuk beberapa alasan, bukan hanya daftar tampilan tuplex[1], x[2]
. Ataukeyfunc = operator.itemgetter(1, 2)
dan bahkan tidak menulis fungsi sendiri.Kita juga dapat menggunakan .sort dengan lambda 2 kali karena semacam python sudah ada dan stabil. Ini pertama-tama akan mengurutkan daftar berdasarkan elemen kedua, x [1]. Kemudian, itu akan mengurutkan elemen pertama, x [0] (prioritas tertinggi).
Ini sama dengan melakukan yang berikut ini: employee.sort (key = lambda x: (x [0], x [1]))
sumber
Dalam urutan menaik, Anda dapat menggunakan:
atau dalam urutan menurun Anda dapat menggunakan:
sumber
Daftar sortir dicts menggunakan di bawah ini akan mengurutkan daftar dalam urutan menurun pada kolom pertama sebagai gaji dan kolom kedua sesuai usia
Output: [{'gaji': 123, 'usia': 25}, {'gaji': 123, 'usia': 23}]
sumber