lambda adalah fungsi anonim, itu setara dengan:
def func(p):
return p.totalScore
Sekarang maxmenjadi:
max(players, key=func)
Tetapi karena defpernyataan adalah pernyataan majemuk, mereka tidak dapat digunakan di mana ekspresi diperlukan, itulah sebabnya terkadang lambdadigunakan.
Perhatikan bahwa lambdaitu setara dengan apa yang Anda masukkan dalam pernyataan pengembalian a def. Dengan demikian, Anda tidak dapat menggunakan pernyataan di dalam lambda, hanya ekspresi yang diizinkan.
Apa yang maxharus dilakukan
maks (a, b, c, ... [, key = func]) -> nilai
Dengan argumen iterable tunggal, kembalikan item terbesarnya. Dengan dua atau lebih argumen, kembalikan argumen terbesar.
Jadi, itu hanya mengembalikan objek yang terbesar.
Bagaimana cara keykerjanya?
Secara default di Python 2 keymembandingkan item berdasarkan seperangkat aturan berdasarkan jenis objek (misalnya string selalu lebih besar dari integer).
Untuk memodifikasi objek sebelum perbandingan, atau membandingkan berdasarkan atribut / indeks tertentu, Anda harus menggunakan keyargumen.
Contoh 1:
Contoh sederhana, misalkan Anda memiliki daftar angka dalam bentuk string, tetapi Anda ingin membandingkan item tersebut dengan nilai integernya.
>>> lis = ['1', '100', '111', '2']
Di sini maxmembandingkan item menggunakan nilai aslinya (string dibandingkan secara leksikografis sehingga Anda akan mendapatkan '2'sebagai output):
>>> max(lis)
'2'
Untuk membandingkan item dengan menggunakan nilai integer mereka keydengan sederhana lambda:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Contoh 2: Menerapkan maxke daftar tupel.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Secara default maxakan membandingkan item dengan indeks pertama. Jika indeks pertama sama maka akan membandingkan indeks kedua. Seperti dalam contoh saya, semua item memiliki indeks pertama yang unik, jadi Anda akan mendapatkan ini sebagai jawabannya:
>>> max(lis)
(4, 'e')
Tetapi, bagaimana jika Anda ingin membandingkan setiap item dengan nilai pada indeks 1? Sederhana: gunakan lambda:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Membandingkan item dalam iterable yang berisi objek dari tipe yang berbeda :
Daftar dengan barang-barang campuran:
lis = ['1','100','111','2', 2, 2.57]
Dalam Python 2 dimungkinkan untuk membandingkan item dari dua jenis :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
Tetapi dalam Python 3 Anda tidak bisa melakukan itu lagi :
>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
max(lis)
TypeError: unorderable types: int() > str()
Tapi ini berhasil, karena kami membandingkan versi integer dari setiap objek:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'