2013-01-31 38 views
5

Tôi đang cố gắng sử dụng lambda để phân loại một số trong danh sách. Những gì tôi muốn làm là sắp xếp các tọa độ dựa trên khoảng cách manhattan của chúng từ một sự xâm lấn trong miệng. Tôi biết tôi có hầu hết các cú pháp xuống nhưng có vẻ như tôi đang thiếu một cái gì đó nhỏ, Cảm ơn!Sử dụng lambda trong Python

while (len(queue) > 0): 
    queue.sort(queue, lambda x: util.manhattanDistance(curr,x)) 
+0

Lưu ý rằng, các câu lệnh kiểm soát trong Python không cần (và không nên có) dấu ngoặc đơn: 'while len (hàng đợi)> 0: '. Nhưng, vì 0 là false và bất kỳ số nguyên nào khác không phải, điều này giống hệt với 'while len (queue):'. Và, vì một chuỗi rỗng là sai và bất kỳ trình tự nào khác không, chuỗi này giống hệt với 'while queue:'. Và đó là cách bạn nên viết nó - nó thành ngữ hơn, dễ đọc hơn, ngắn hơn và thậm chí có thể hiệu quả hơn. – abarnert

+0

Một vấn đề nữa tôi vừa nhận thấy: Bạn đang chuyển 'hàng đợi' làm đối số đầu tiên cho' queue.sort'. Dù loại 'hàng đợi' là gì, điều đó không đúng. (Oh, và không gọi biến 'hàng đợi'; đó là tên của một mô-đun thư viện chuẩn.) – abarnert

+0

Ngoài ra:' sort' sẽ không thay đổi độ dài của đối tượng, vì vậy đây chỉ là lặp đi lặp lại mãi mãi, sắp xếp lại một danh sách đã được sắp xếp đi lặp lại. – abarnert

Trả lời

5

Có vẻ như bạn đang cố gắng để nói với các phương pháp sort() để sử dụng chức năng lambda của bạn như là chìa khóa để phân loại. Này được thực hiện với sự tranh luận từ khóakey:

queue.sort(queue, key = [your lambda function])

Dòng viết lại là:

queue.sort(queue, key = lambda x: util.manhattanDistance(curr,x))

EDIT: hiểu lầm mục đích của hàm lambda gốc; nghĩ rằng nó được dự định như một hàm so sánh, điều này không có ý nghĩa vì các hàm khoảng cách không thể là số âm

+1

+1. Nhưng có lẽ giá trị giải thích rằng, như orginally bằng văn bản (trong 2.x), OP _is_ sử dụng 'lambda' như một hàm' cmp', và đó chính xác là lý do tại sao nó không hoạt động. (Trong Python 3, mã thực sự sẽ hoạt động như được viết.) – abarnert

+1

Ah, cảm ơn bạn. Tôi không biết thứ tự của các đối số từ khóa và không muốn tìm kiếm nó. Tôi nghĩ rằng chìa khóa cất cánh ở đây là nó an toàn hơn để xác định rõ ràng các đối số từ khóa. –

+0

Chắc chắn đã đồng ý. Bên cạnh việc an toàn hơn và làm cho mã của bạn hoạt động với cả 2.x và 3.x (và IIRC, '2to3' sẽ không khắc phục vấn đề này), nó cũng dễ đọc hơn nhiều. _Nobody_ nhớ thứ tự là gì. Lý do duy nhất để sử dụng chức năng 'cmp' không có từ khóa là nếu bạn cần tương thích với Python 2.3 hoặc cũ hơn. – abarnert

Các vấn đề liên quan