Saya memiliki daftar kamus dan ingin setiap item diurutkan berdasarkan nilai properti tertentu.
Pertimbangkan array di bawah ini,
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
Ketika diurutkan berdasarkan name
, harus menjadi
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
[{'name':'Bart', 'age':10, 'note':3},{'name':'Homer','age':10,'note':2},{'name':'Vasile','age':20,'note':3}]
dan menggunakan:from operator import itemgetter newlist = sorted(old_list, key=itemgetter(-'note','name')
EDIT: Diuji, dan itu berfungsi tetapi saya tidak tahu cara membuat DESC catatan dan nama ASC.Jawaban:
Ini mungkin terlihat lebih bersih menggunakan kunci bukan cmp:
atau seperti yang disarankan JFSebastian dan lainnya,
Untuk kelengkapan (seperti yang ditunjukkan dalam komentar oleh fitzgeraldsteele), tambahkan
reverse=True
untuk mengurutkan menurunsumber
itemgetter(i)
manai
indeks elemen tuple untuk mengurutkan.itemgetter
menerima lebih dari satu argumen:itemgetter(1,2,3)
adalah fungsi yang mengembalikan tuple likeobj[1], obj[2], obj[3]
, sehingga Anda dapat menggunakannya untuk melakukan jenis yang kompleks.Untuk mengurutkan daftar kamus dengan kunci = 'nama':
Untuk mengurutkan daftar kamus berdasarkan key = 'age':
sumber
key=lambda k: (k['name'], k['age'])
,. (ataukey=itemgetter('name', 'age')
). tuplecmp
akan membandingkan setiap elemen secara bergantian. sangat brilian.key
argumen opsional untuklist.sort()
tidak dijelaskan. Ada ide di mana menemukannya?list
dan teman-teman.my_list
sekarang akan menjadi apa yang Anda inginkan.(3 tahun kemudian) Diedit untuk menambahkan:
key
Argumen baru lebih efisien dan lebih rapi. Jawaban yang lebih baik sekarang terlihat seperti:... lambda adalah, IMO, lebih mudah dipahami daripada
operator.itemgetter
, tetapi YMMV.sumber
Jika Anda ingin mengurutkan daftar dengan beberapa tombol, Anda dapat melakukan hal berikut:
Ini agak meretas, karena bergantung pada konversi nilai menjadi representasi string tunggal untuk perbandingan, tetapi berfungsi seperti yang diharapkan untuk angka termasuk yang negatif (meskipun Anda perlu memformat string Anda dengan tepat dengan bantalan nol jika Anda menggunakan angka)
sumber
'key' digunakan untuk mengurutkan berdasarkan nilai sewenang-wenang dan 'itemgetter' menetapkan nilai itu ke atribut 'nama' setiap item.
sumber
sumber
Saya kira Anda maksud:
Ini akan disortir seperti ini:
sumber
Anda bisa menggunakan fungsi perbandingan khusus, atau Anda bisa meneruskan fungsi yang menghitung kunci penyortiran khusus. Itu biasanya lebih efisien karena kuncinya hanya dihitung sekali per item, sedangkan fungsi perbandingan akan dipanggil berkali-kali.
Anda bisa melakukannya dengan cara ini:
Tapi perpustakaan standar berisi rutin generik untuk mendapatkan barang-barang dari objek sewenang-wenang:
itemgetter
. Jadi coba ini sebagai gantinya:sumber
Menggunakan Schwartzian transform dari Perl,
melakukan
memberi
Lebih lanjut tentang transformasi Perl Schwartzian
sumber
key=
untuk.sort
sejak 2.4, yaitu tahun 2004, ia melakukan transformasi Schwartzian dalam kode penyortiran, di C; dengan demikian metode ini hanya berguna pada Python 2.0-2.3. yang semuanya berusia lebih dari 12 tahun.Anda harus mengimplementasikan fungsi perbandingan Anda sendiri yang akan membandingkan kamus dengan nilai-nilai kunci nama. Lihat Menyortir Mini-BAGAIMANA dari PythonInfo Wiki
sumber
kadang-kadang kita perlu menggunakan
lower()
misalnyasumber
Inilah solusi umum alternatif - ini mengurutkan elemen-elemen dict dengan kunci dan nilai. Keuntungannya - tidak perlu menentukan kunci, dan itu akan tetap berfungsi jika beberapa kunci tidak ada di beberapa kamus.
sumber
Menggunakan paket panda adalah metode lain, meskipun runtime dalam skala besar jauh lebih lambat daripada metode yang lebih tradisional yang diusulkan oleh orang lain:
Berikut adalah beberapa nilai patokan untuk daftar kecil dan daftar besar (100k +) daftar berikut:
sumber
Jika Anda tidak perlu asli
list
daridictionaries
, Anda bisa memodifikasinya di tempat dengansort()
metode menggunakan fungsi tombol kustom.Fungsi kunci:
Yang
list
akan diurutkan:Mengurutkannya di tempat:
Jika Anda memerlukan yang asli
list
, panggilsorted()
fungsi yang meneruskannyalist
dan fungsi tombol, lalu tetapkan yang dikembalikan yang diurutkanlist
ke variabel baru:Pencetakan
data_one
dannew_data
.sumber
Katakanlah saya memiliki kamus
D
dengan elemen di bawah ini. Untuk mengurutkan cukup gunakan argumen kunci diurutkan untuk melewati fungsi kustom seperti di bawah ini:Lihat ini .
sumber
Saya telah menjadi penggemar berat filter w / lambda namun itu bukan pilihan terbaik jika Anda mempertimbangkan kompleksitas waktu
Pilihan pertama
Opsi kedua
Perbandingan cepat dari waktu exec
sumber
Jika kinerja menjadi masalah, saya akan menggunakan
operator.itemgetter
alih-alihlambda
fungsi bawaan berfungsi lebih cepat daripada fungsi buatan tangan. Theitemgetter
Fungsi tampaknya melakukan sekitar 20% lebih cepat darilambda
berdasarkan pengujian saya.Dari https://wiki.python.org/moin/PythonSpeed :
Berikut ini adalah perbandingan menyortir kecepatan menggunakan
lambda
vsitemgetter
.Kedua teknik mengurutkan daftar dalam urutan yang sama (diverifikasi oleh pelaksanaan pernyataan akhir dalam blok kode) tetapi satu sedikit lebih cepat.
sumber
Anda dapat menggunakan kode berikut
sumber