Trong Python 2.4, bạn có thể vượt qua một trình so sánh tùy chỉnh để sắp xếp.Phân loại Python 3: Trình so sánh tùy chỉnh bị xóa theo ưu tiên của khóa - tại sao?
Hãy danh sách -
list=[5,1,2,3,6,0,7,1,4]
Để sắp xếp với các số chẵn đầu tiên, và sau đó tỷ lệ cược, chúng ta có thể làm như sau -
evenfirst=lambda x,y:1 if x%2>y%2 else -1 if y%2>x%2 else x-y
list.sort(cmp=evenfirst)
list == [0, 2, 4, 6, 1, 1, 3, 5, 7] # True
Trong Python 3, bạn có thể chỉ vượt qua key
(cũng được hỗ trợ trong Python 2.4).
Tất nhiên, việc phân loại tương tự có thể đạt được bằng Python 3 với quyền key
:
list.sort(key=lambda x:[x%2,x])
Tôi tò mò về quyết định của không hỗ trợ Người đối chiếu tùy chỉnh nữa, đặc biệt là khi có vẻ như cái gì đó có thể được thực hiện dễ dàng đủ.
Có đúng là trong hầu hết các trường hợp, thứ tự sắp xếp mong muốn có tự nhiên key
không?
Trong ví dụ trên, ví dụ, khóa như vậy tồn tại - và thực tế mã trở nên ngắn gọn hơn bằng cách sử dụng nó. Nó luôn luôn như vậy?
(tôi biết recipe này để chuyển đổi Comparer để chìa khóa, nhưng lý tưởng, người ta không cần phải lấy cách giải quyết như vậy nếu nó có thể được xây dựng thành các ngôn ngữ.)
Trong video này, Raymond Hettinger giải thích lý do tại sao 'cmp' bị xóa: [Biến mã thành dạng đẹp, thành ngữ Python] (http://www.youtube.com/watch?v=OSGv2VnC0go) (nhảy tới 10:05, thứ tự sắp xếp tùy chỉnh) –
FWIW, 'cmp_to_key' hiện tồn tại trong' functools', vì vậy bạn không cần một công thức bên ngoài. – DSM