Phương pháp cmp_to_key
trả về một đối tượng đặc biệt có tác dụng như một chìa khóa thay thế:
class K(object):
__slots__ = ['obj']
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
def __hash__(self):
raise TypeError('hash not implemented')
Khi phân loại, mỗi phím sẽ nhận được so với hầu hết các phím khác trong chuỗi. Phần tử này có ở vị trí 0 thấp hơn hoặc lớn hơn đối tượng kia không?
Bất cứ khi nào điều đó xảy ra, móc móc phương pháp đặc biệt được gọi, do đó, __lt__
hoặc __gt__
được gọi, thay vào đó, khóa thay thế sẽ chuyển sang phương thức cmp
.
Vì vậy, danh sách [1, 2, 3]
được sắp xếp như [K(1), K(2), K(3)]
, và nếu, chẳng hạn, K(1)
được so sánh với K(2)
để xem nếu K(1)
thấp, sau đó K(1).__lt__(K(2))
được gọi, được dịch sang mycmp(1, 2) < 0
.
Đây là cách phương pháp cũ cmp
đang hoạt động anyway; trả về -1, 0 hoặc 1 phụ thuộc vào thời điểm đối số đầu tiên thấp hơn, bằng hoặc lớn hơn đối số thứ hai. Khóa thay thế dịch các số đó trở lại các giá trị boolean cho các toán tử so sánh.
Tại thời điểm nào, khóa thay thế cần biết bất kỳ điều gì về vị trí tuyệt đối. Nó chỉ cần biết về một đối tượng khác được so sánh với và móc phương pháp đặc biệt cung cấp đối tượng khác.
Wow, một ví dụ thực tế là Java có một giải pháp đơn giản hơn nhiều cho cùng một vấn đề hơn Python. Không có nhiều. – jeremyjjbrown
@jeremyjjbrown: hàm 'cmp_to_key' chỉ tồn tại để hỗ trợ các thuật toán sắp xếp kế thừa. Phương pháp pythonic đơn giản hơn là sử dụng hàm 'key' cho' được sắp xếp() 'thay thế. –
Đôi khi rất khó để đưa ra một 'khóa' nhưng dễ dàng để đưa ra một hàm so sánh ... ví dụ, tôi muốn sắp xếp một danh sách các số để tất cả các số lẻ đến trước, theo thứ tự tăng dần, và sau đó tất cả ngay cả những con số tiếp theo, theo thứ tự giảm dần. – rlbond