Cara mengurutkan dengan lambda dengan Python

179

Dengan Python, saya mencoba mengurutkan berdasarkan tanggal dengan lambda. Saya tidak dapat memahami pesan kesalahan saya. Pesannya adalah:

<lambda>() takes exactly 1 argument (2 given)

Garis yang saya miliki adalah

a = sorted(a, lambda x: x.modified, reverse=True)
Niklas R.
sumber
8
tambahkan keywoard argumen key = lambda x: x.modified akan menyelesaikan masalah
shahjapan

Jawaban:

325

Menggunakan

a = sorted(a, key=lambda x: x.modified, reverse=True)
#             ^^^^

Pada Python 2.x, sortedfungsi mengambil argumennya dalam urutan ini:

sorted(iterable, cmp=None, key=None, reverse=False)

jadi tanpa key=, fungsi yang Anda lewati akan dianggap sebagai cmpfungsi yang membutuhkan 2 argumen.

kennytm
sumber
13
Anda memiliki peluang bagus untuk belajar menghargai parameter kata kunci yang lulus dari pengalaman ini.
Tony Veijalainen
1
Ini sudah sangat lama, tetapi, apakah Anda tahu mengapa kode kesalahan menyesatkan? Jawaban Anda terdengar seperti kemungkinan Python memasok lambdadengan parameter lain karena cmpfungsi membutuhkan 2?
SuperBiasedMan
@SuperBiasedMan kesalahannya tidak menyesatkan. cmp, fungsi pembanding mengambil dua argumen. Jika Anda tidak menentukan bahwa Anda melewati a key, itu diasumsikan dari urutan parameter fungsi yang Anda lewati pembanding. Lambda Anda mengambil satu parameter, karena itu bukan pembanding yang valid dan itulah yang dikatakan kesalahan.
Jezor
19
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Ini akan dicetak sebagai berikut:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Triliuner Sanai
sumber
Ini tidak berfungsi untuk bilangan bulat string. Lihat ini! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (kunci = lambda x: x [1]) cetak (pertama )
Daniel Kua
Hasilnya adalah [('303', '30'), ('343', '34'), ('999', '9')] yang tidak diurutkan berdasarkan elemen kedua dalam setiap daftar.
Daniel Kua
lst = [('candy', '999', '9'), ('apple', '303', '30'), ('baby', '343', '34')] lst.sort (kunci = lambda x: x [2]) print (lst)
Daniel Kua
[('apel', '303', '30'), ('bayi', '343', '34'), ('permen', '999', '9')]. Yang tidak diurutkan berdasarkan 2 elemen juga!
Daniel Kua
8

Daftar Python memiliki dua cara bawaan untuk mengurutkan data:

sort()  A method that modifies the list in-place
sorted()  A built-in function that builds a new sorted list from an iterable

Berdasarkan kebutuhan Anda, Anda dapat memilih di antara dua ini:

jika Anda ingin menyimpan daftar asli, Anda dapat menggunakan fungsi diurutkan atau jika Anda tidak perlu daftar asli Anda dapat menggunakan fungsi sortir.

Sebelum melakukan sortir atau sortir, kita perlu memahami lambda.

Lambda adalah fungsi anonim dan fungsi anonim adalah fungsi yang didefinisikan tanpa nama, posting ini tampaknya menjelaskannya dengan cukup baik.

https://www.programiz.com/python-programming/anonymous-function

Fungsi Lambda bagus untuk memanggil in-line karena mereka hanya memiliki satu ekspresi yang dievaluasi dan dikembalikan. Mereka sintaks untuk lambda adalah:

argumen lambda: ekspresi

mari kita lihat bagaimana cara menggunakan fungsi yang diurutkan:

student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
sorted(student_tuples, key=lambda student: student[2]) 

output: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Di sini kita dapat melihat daftar student_tuples yang memiliki tuple diurutkan berdasarkan parameter kunci asalkan siswa [2].

Preeti Duhan
sumber