lambda
เป็นฟังก์ชั่นที่ไม่ระบุชื่อมันเทียบเท่ากับ:
def func(p):
return p.totalScore
ตอนนี้max
กลายเป็น:
max(players, key=func)
แต่เนื่องจากdef
statement เป็นstatement แบบผสมจึงไม่สามารถใช้เมื่อต้องการนิพจน์นั่นคือเหตุผลที่บางครั้งlambda
มีการใช้
โปรดทราบว่าเทียบเท่ากับสิ่งที่คุณต้องการใส่ในงบการกลับมาของlambda
def
ดังนั้นคุณไม่สามารถใช้คำสั่งภายใน a lambda
อนุญาตให้ใช้นิพจน์เท่านั้น
อะไรmax
ทำอย่างไร
ค่าสูงสุด (a, b, c, ... [, key = func]) -> ค่า
ด้วยอาร์กิวเมนต์ iterable เดียวให้ส่งคืนไอเท็มที่ใหญ่ที่สุด ด้วยอาร์กิวเมนต์สองตัวขึ้นไปส่งคืนอาร์กิวเมนต์ที่ใหญ่ที่สุด
ดังนั้นมันจะคืนค่าวัตถุที่ใหญ่ที่สุด
วิธีการkey
ทำงานหรือไม่
ตามค่าเริ่มต้นใน Python 2 จะkey
เปรียบเทียบสินค้าตามชุดของกฎตามประเภทของวัตถุ (เช่นสตริงจะมีค่ามากกว่าจำนวนเต็มเสมอ)
ในการปรับเปลี่ยนวัตถุก่อนทำการเปรียบเทียบหรือเพื่อเปรียบเทียบตามคุณลักษณะ / ดัชนีเฉพาะคุณต้องใช้key
อาร์กิวเมนต์
ตัวอย่างที่ 1:
ตัวอย่างง่ายๆสมมติว่าคุณมีรายการตัวเลขในรูปแบบสตริง แต่คุณต้องการเปรียบเทียบรายการเหล่านั้นด้วยค่าจำนวนเต็ม
>>> lis = ['1', '100', '111', '2']
ที่นี่max
เปรียบเทียบรายการโดยใช้ค่าดั้งเดิมของพวกเขา (สตริงที่มีการเปรียบเทียบพจนานุกรมเพื่อให้คุณได้รับ'2'
เป็นเอาท์พุท):
>>> max(lis)
'2'
ในการเปรียบเทียบไอเท็มตามค่าจำนวนเต็มใช้key
กับวิlambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
ตัวอย่างที่ 2: การนำmax
ไปใช้กับรายการของสิ่งอันดับ
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
โดยค่าเริ่มต้นmax
จะเปรียบเทียบรายการตามดัชนีแรก หากดัชนีแรกเหมือนกันมันจะเปรียบเทียบดัชนีที่สอง ในตัวอย่างของฉันรายการทั้งหมดมีดัชนีแรกที่ไม่ซ้ำกันดังนั้นคุณจะได้รับสิ่งนี้เป็นคำตอบ:
>>> max(lis)
(4, 'e')
แต่ถ้าคุณต้องการเปรียบเทียบแต่ละรายการด้วยค่าที่ดัชนี 1 ใช้ง่ายlambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
การเปรียบเทียบไอเท็มใน iterable ที่มีออบเจ็กต์ประเภทต่าง ๆ :
รายการที่มีรายการผสม:
lis = ['1','100','111','2', 2, 2.57]
ใน Python 2 เป็นไปได้ที่จะทำการเปรียบเทียบไอเท็มที่มีสองประเภทที่แตกต่างกัน :
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
แต่ใน Python 3 คุณไม่สามารถทำได้อีกต่อไป :
>>> 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()
แต่ใช้งานได้เนื่องจากเรากำลังเปรียบเทียบรุ่นจำนวนเต็มของแต่ละวัตถุ:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'