lambda
adalah fungsi anonim, itu setara dengan:
def func(p):
return p.totalScore
Sekarang max
menjadi:
max(players, key=func)
Tetapi karena def
pernyataan adalah pernyataan majemuk, mereka tidak dapat digunakan di mana ekspresi diperlukan, itulah sebabnya terkadang lambda
digunakan.
Perhatikan bahwa lambda
itu 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 max
harus 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 key
kerjanya?
Secara default di Python 2 key
membandingkan 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 key
argumen.
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 max
membandingkan 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 key
dengan sederhana lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
Contoh 2: Menerapkan max
ke daftar tupel.
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Secara default max
akan 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'