วิธีการจัดเรียง lambda ใน Python


179

ใน Python ฉันพยายามเรียงลำดับวันที่ด้วยแลมบ์ดา ฉันไม่เข้าใจข้อความแสดงข้อผิดพลาด ข้อความคือ:

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

บรรทัดที่ฉันมีคือ

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

8
เพิ่ม keywoard argument key = lambda x: x.modified จะแก้ปัญหาได้
shahjapan

คำตอบ:


325

ใช้

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

บน Python 2.x sortedฟังก์ชันรับอาร์กิวเมนต์ตามลำดับนี้:

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

ดังนั้นหากไม่มีkey=ฟังก์ชั่นที่คุณส่งผ่านจะถูกพิจารณาว่าเป็นcmpฟังก์ชันที่ใช้เวลา 2 ข้อโต้แย้ง


13
คุณมีโอกาสที่จะเรียนรู้ที่จะชื่นชมพารามิเตอร์คำหลักที่ส่งผ่านจากประสบการณ์นี้
Tony Veijalainen

1
นี่เก่ามาก แต่คุณมีความคิดว่าทำไมรหัสข้อผิดพลาดทำให้เข้าใจผิดหรือไม่ คำตอบของคุณดูเหมือนเป็นไปได้ว่า Python กำลังส่งlambdaพารามิเตอร์อื่นมาให้เนื่องจากcmpฟังก์ชั่นใช้เวลา 2?
SuperBiasedMan

@SuperBiasedMan ข้อผิดพลาดไม่ได้ทำให้เข้าใจผิด cmpฟังก์ชั่นการเปรียบเทียบใช้เวลาสองข้อโต้แย้ง หากคุณไม่ได้ระบุว่าคุณกำลังผ่าน a keyมันจะสันนิษฐานได้จากลำดับพารามิเตอร์ฟังก์ชั่นที่คุณจะผ่านการเปรียบเทียบ แลมบ์ดาของคุณรับหนึ่งพารามิเตอร์ดังนั้นจึงไม่ใช่ตัวเปรียบเทียบที่ถูกต้องและนั่นคือสิ่งที่เกิดข้อผิดพลาด
Jezor

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

มันจะพิมพ์ดังต่อไปนี้:

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

สิ่งนี้ใช้ไม่ได้กับสตริงจำนวนเต็ม ลองดู! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (key = lambda x: x [1]) พิมพ์ (lst )
Daniel Kua

ผลลัพธ์คือ [('303', '30'), ('343', '34'), ('999', '9')] ซึ่งไม่ได้จัดเรียงฐานในองค์ประกอบที่สองในทุกรายการ
แดเนียลกัว

lst = [('ขนม', '999', '9'), ('แอปเปิ้ล', '303', '30'), ('ทารก', '343', '34')] lst.sort (คีย์ = lambda x: x [2]) พิมพ์ (lst)
Daniel Kua

[('apple', '303', '30'), ('baby', '343', '34'), ('candy', '999', '9')] ซึ่งไม่ได้เรียงลำดับตาม 2 องค์ประกอบเช่นกัน!
แดเนียลกัว

8

รายการ Python มีสองวิธีในการเรียงลำดับข้อมูล:

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

ขึ้นอยู่กับความต้องการของคุณคุณสามารถเลือกระหว่างสองเหล่านี้:

ถ้าคุณต้องการเก็บรายการดั้งเดิมคุณสามารถใช้ฟังก์ชันเรียงลำดับหรือถ้าคุณไม่ต้องการรายการต้นฉบับคุณสามารถใช้ฟังก์ชันเรียงลำดับได้

ก่อนจะเรียงลำดับหรือเรียงลำดับเราต้องเข้าใจแลมบ์ดา

แลมบ์ดาเป็นฟังก์ชั่นนิรนามและฟังก์ชั่นนิรนามเป็นฟังก์ชั่นที่กำหนดโดยไม่มีชื่อโพสต์นี้ดูเหมือนจะอธิบายได้อย่างดี

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

ฟังก์ชั่นแลมบ์ดาเป็นสิ่งที่ดีสำหรับการโทรในบรรทัดเพราะมีเพียงนิพจน์เดียวที่ได้รับการประเมินและส่งคืน ไวยากรณ์สำหรับแลมบ์ดาคือ:

ข้อโต้แย้งแลมบ์ดา: การแสดงออก

มาดูวิธีการใช้ฟังก์ชั่นเรียงลำดับ:

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

ผลลัพธ์: [('เดฟ', 'B', 10), ('เจน', 'B', 12), ('จอห์น', 'A', 15)]

ที่นี่เราสามารถดูรายการ student_tuples ที่มี tuples เรียงตามพารามิเตอร์ที่สำคัญที่นักเรียน [2]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.