Python'da lambda ile sıralama


179

Python'da lambda ile tarihe göre sıralamaya çalışıyorum. Hata mesajımı anlayamıyorum. Mesaj:

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

Sahip olduğum çizgi

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

8
keywoard argümanı ekle key = lambda x: x.modified sorunu çözecek
shahjapan

Yanıtlar:


325

kullanım

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

Python 2.x üzerinde, sortedişlev bağımsız değişkenlerini şu sırayla alır:

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

bu nedenle key=, ilettiğiniz cmpişlev 2 argüman alan bir işlev olarak kabul edilir .


13
Bu deneyimden geçen anahtar kelime parametresini takdir etmeyi öğrenmek için iyi bir şansınız var.
Tony Veijalainen

1
Bu çok eskidir, ancak hata kodunun neden yanıltıcı olduğuna dair bir fikriniz var mı? lambdaBir cmpfonksiyon 2 aldığından cevabınız Python'un başka bir parametre ile tedarik ettiği anlaşılıyor.
SuperBiasedMan

@SuperBiasedMan hata yanıltıcı değil. cmp, bir karşılaştırma işlevi iki bağımsız değişken alır. Eğer bir geçmekte olduğunuzu belirtmezseniz, keybir karşılaştırıcıyı geçtiğinizin fonksiyon parametreleri sırasından olduğu varsayılır. Lambda'nız bir parametre alır, bu nedenle geçerli bir karşılaştırıcı değildir ve hatanın söylediği şey budur.
Jezor

19
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Aşağıdaki gibi yazdırılacaktır:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]

Bu, dize tamsayıları için çalışmaz. Şuna bir bak! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (anahtar = lambda x: x [1]) yazdır (lst )
Daniel Kua

Sonuç, her listedeki ikinci öğeye göre sıralanmayan [('303', '30'), ('343', '34'), ('999', '9')] 'dir.
Daniel Kua

lst = [('şeker', '999', '9'), ('elma', '303', '30'), ('bebek', '343', '34')] lst.sort (anahtar = lambda x: x [2]) baskı (lst)
Daniel Kua

[('elma', '303', '30'), ('bebek', '343', '34'), ('şeker', '999', '9')]. Bu da 2 elemente göre sıralanmamıştır!
Daniel Kua

8

Python listelerinin verileri sıralamak için iki yerleşik yolu vardır:

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

İhtiyacınıza göre bu ikisi arasından seçim yapabilirsiniz:

orijinal listeyi tutmak istiyorsanız, sıralama işlevini kullanabilir veya orijinal listeye ihtiyacınız yoksa sıralama işlevini kullanabilirsiniz.

Sıralama veya sıralamadan önce lambda'yı anlamamız gerekir.

Bir lambda anonim bir işlevdir ve anonim bir işlev isimsiz olarak tanımlanmış bir işlevdir, bu yazı oldukça güzel açıklıyor gibi görünüyor.

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

Lambda işlevleri satır içi arama için iyidir, çünkü yalnızca bir ifadesi değerlendirilir ve döndürülür. Bir lambda için sözdizimi:

lambda argümanları: ifade

sıralama işlevinin nasıl kullanılacağını görelim:

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

çıktı: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Burada tuplesli student_tuples'ın öğrenci [2] olması koşuluyla anahtar parametreye göre sıralandığını görebiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.