Cách sắp xếp với lambda trong Python


178

Trong Python, tôi đang cố gắng sắp xếp theo ngày với lambda. Tôi không thể hiểu thông báo lỗi của tôi. Tin nhắn là:

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

Dòng tôi có là

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

8
thêm đối số keywoard key = lambda x: x.modified sẽ giải quyết vấn đề
shahjapan

Câu trả lời:


325

Sử dụng

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

Trên Python 2.x, sortedhàm lấy các đối số theo thứ tự này:

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

Vì vậy, nếu không có key=, hàm bạn truyền vào sẽ được coi là cmphàm có 2 đối số.


13
Bạn có cơ hội tốt để học cách đánh giá cao thông số từ khóa chuyển từ trải nghiệm này.
Tony Veijalainen

1
Điều này rất cũ nhưng, bạn có biết tại sao mã lỗi lại gây hiểu nhầm không? Câu trả lời của bạn nghe có vẻ như Python đang cung cấp lambdavới một tham số khác vì một cmphàm mất 2?
SuperBiasedMan

@SuperBiasedMan lỗi không sai. cmp, một hàm so sánh có hai đối số. Nếu bạn không chỉ định rằng bạn đang vượt qua a key, thì nó được giả sử từ thứ tự tham số chức năng mà bạn đang vượt qua một bộ so sánh. Lambda của bạn có một tham số, do đó không phải là một bộ so sánh hợp lệ và đó là những gì lỗi nói.
Jezor

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

Nó sẽ in như sau:

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

Điều này không làm việc cho số nguyên chuỗi. Kiểm tra này! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (key = lambda x: x [1]) in (lst )
Daniel Kua

Kết quả là [('303', '30'), ('343', '34'), ('999', '9')] không được sắp xếp dựa trên thành phần thứ hai trong mọi danh sách.
Daniel Kua

lst = [('kẹo', '999', '9'), ('táo', '303', '30'), ('bé', '343', '34')] lst.sort (khóa = lambda x: x [2]) in (lst)
Daniel Kua

[('Táo', '303', '30'), ('bé', '343', '34'), ('kẹo', '999', '9')]. Mà không được sắp xếp dựa trên 2 yếu tố quá!
Daniel Kua

7

Danh sách Python có hai cách dựng sẵn để sắp xếp dữ liệu:

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

Dựa trên yêu cầu của bạn, bạn có thể chọn trong số hai:

nếu bạn muốn giữ danh sách gốc, bạn có thể sử dụng chức năng được sắp xếp hoặc nếu bạn không cần danh sách gốc, bạn có thể sử dụng chức năng sắp xếp.

Trước khi tiếp tục sắp xếp hoặc sắp xếp, chúng ta cần hiểu lambda.

Lambda là một hàm ẩn danh và một hàm ẩn danh là một hàm được định nghĩa mà không có tên, bài đăng này dường như giải thích nó khá độc đáo.

https://www.programiz.com/python-programming/anonymous-f ghép

Các hàm Lambda rất hay khi gọi nội tuyến vì chúng chỉ có một biểu thức được ước tính và trả về. Họ cú pháp cho một lambda là:

đối số lambda: biểu thức

Hãy xem cách sử dụng chức năng được sắp xếp:

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

đầu ra: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Ở đây chúng ta có thể thấy danh sách student_tuples có các bộ dữ liệu được sắp xếp dựa trên tham số chính với điều kiện là sinh viên [2].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.