Trong Python, cả hai phương pháp list.sort
và sorted
hàm dựng sẵn chấp nhận tham số tùy chọn có tên key
, là một hàm, được đưa ra một phần tử từ danh sách trả về khóa sắp xếp của nó.Python: chức năng cmp_to_key của functools hoạt động như thế nào?
Các phiên bản Python cũ sử dụng phương pháp khác sử dụng thông số cmp
thay thế, là hai hàm từ danh sách trả về số âm nếu số đầu tiên nhỏ hơn số thứ hai, bằng không nếu có bằng và dương nếu số đầu tiên lớn hơn. Tại một số điểm, tham số này không được chấp nhận và không được bao gồm trong Python 3.
Ngày khác tôi muốn sắp xếp danh sách các phần tử theo cách mà hàm cmp
dễ viết hơn nhiều so với số key
. Tôi không muốn sử dụng tính năng không dùng nữa vì vậy tôi đọc tài liệu và tôi thấy rằng có một chức năng có tên là cmp_to_key
trong mô-đun functools
, như tên của nó, nhận hàm cmp
và trả về một key
một ... hoặc đó là những gì tôi nghĩ đến khi tôi đọc mã nguồn (hoặc ít nhất là một phiên bản tương đương) của chức năng cao cấp này bao gồm trong docs
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K(object):
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
return K
Mặc dù thực tế rằng cmp_to_key
công trình như mong đợi, tôi bị bất ngờ trước thực tế rằng đây chức năng không trả về hàm nhưng thay vào đó, lớp K
. Tại sao? Làm thế nào nó hoạt động? Tôi đoán rằng hàm sorted
kiểm tra nội bộ xem cmp là một hàm hay một lớp K hay cái gì đó tương tự, nhưng tôi không chắc chắn.
P.S .: Bất chấp sự lố bịch của anh ấy, tôi thấy rằng lớp K rất hữu ích. Kiểm tra mã này:
from functools import cmp_to_key
def my_cmp(a, b):
# some sorting comparison which is hard to express using a key function
class MyClass(cmp_to_key(my_cmp)):
...
Bằng cách này, bất kỳ danh sách các trường hợp của MyClass có thể, theo mặc định, được sắp xếp theo các tiêu chí quy định tại my_cmp
Giải thích tuyệt vời. – abc