Saya memiliki beberapa data baik dalam daftar daftar atau daftar tupel, seperti ini:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
Dan saya ingin mengurutkan berdasarkan elemen ke-2 di subset. Berarti, mengurutkan berdasarkan 2,5,8 dari mana 2
berasal (1,2,3)
, 5
berasal dari (4,5,6)
. Apa cara umum untuk melakukan ini? Haruskah saya menyimpan tupel atau daftar di daftar saya?
Jawaban:
atau:
sumber
key=itemgetter(1)
dan di awal file:from operator import itemgetter
sort
berikut adalah metodeList
objek Python, yang menerima fungsi lambda sebagaikey
parameternya. Anda dapat menamainyatup
, ataut
, atau apa pun yang Anda suka dan itu akan tetap berfungsi.tup
di sini menentukan indeks tupel daftar, sehingga1
berarti penyortiran akan dilakukan oleh nilai kedua tupel dari daftar asli (2, 5, 8
).lambda
pendekatan intuitif lebih sederhana daripadaitemgetter
kelas yangitemgetter
tidak intuitif , memang tampak lebih cepat . Saya ingin tahu mengapa ini terjadi. Kecurigaan kasar saya adalah bahwalambda
menimbulkan biaya tersembunyi menangkap semua variabel lokal ke dalam konteks penutupan, sedangkanitemgetter
contoh tidak. tl; dr: Selalu gunakanitemgetter
, karena kecepatan menang.sumber
itemgetter
kelas untuk menyortir 126% lebih cepat daripada rata-rata setaralambda
fungsi.data.sort(key=itemgetter(3,1))
Saya hanya ingin menambahkan jawaban Stephen jika Anda ingin mengurutkan array dari tinggi ke rendah, cara lain selain dari komentar di atas adalah dengan menambahkan ini ke baris:
dan hasilnya adalah sebagai berikut:
sumber
Untuk mengurutkan berdasarkan beberapa kriteria, yaitu misalnya dengan elemen kedua dan ketiga dalam sebuah tuple, mari
dan dengan demikian mendefinisikan lambda yang mengembalikan tuple yang menggambarkan prioritas, misalnya
sumber
Jawaban Stephen adalah yang akan saya gunakan. Untuk kelengkapan, inilah pola DSU (menghias-sortir-undecorate) dengan pemahaman daftar:
Atau, lebih tepatnya:
Seperti yang tercantum dalam Python Sorting HowTo , ini sudah tidak perlu sejak Python 2.4, ketika fungsi utama tersedia.
sumber
Untuk mengurutkan daftar tupel
(<word>, <count>)
, untukcount
dalam urutan menurun danword
dalam urutan abjad:Saya menggunakan metode ini:
dan itu memberi saya hasilnya:
sumber
Tanpa lambda:
sumber
itemgetter()
agak lebih cepat daripadalambda tup: tup[1]
, tetapi peningkatannya relatif sederhana (sekitar 10 hingga 25 persen).(Sesi IPython)
sumber
@Stephen menjawab langsung ke intinya! Ini adalah contoh untuk visualisasi yang lebih baik,
Berteriaklah untuk penggemar Ready Player One! =)
key
adalah fungsi yang akan dipanggil untuk mengubah item koleksi untuk perbandingan .. seperticompareTo
metode di Jawa.Parameter yang diteruskan ke kunci harus berupa sesuatu yang dapat dipanggil. Di sini, penggunaan
lambda
menciptakan fungsi anonim (yang bisa dipanggil).Sintaksis lambda adalah kata lambda diikuti oleh nama yang dapat diubah kemudian satu blok kode.
Contoh di bawah ini, kami mengurutkan daftar tuple yang menyimpan info tentang waktu kejadian dan nama aktor tertentu.
Kami menyortir daftar ini berdasarkan waktu kejadian - yang merupakan elemen ke-0 dari sebuah tuple.
Catatan -
s.sort([cmp[, key[, reverse]]])
mengurutkan item di tempatsumber
Menyortir tuple cukup sederhana:
sumber