정렬이 원본 비교를 지원하지 않는 대상

2910 단어 부호화

문제.


너는 같은 유형의 대상을 정렬하고 싶지만, 그들은 원생의 비교 조작을 지원하지 않는다.

솔루션


내장된sorted () 함수에는 키워드 매개 변수 키가 있습니다.callable 대상을 전송할 수 있습니다. 이callable 대상은 전송된 대상마다 값을 되돌려줍니다. 이 값은sorted에 의해 정렬됩니다.예를 들어, 만약 응용 프로그램에 User 실례 서열이 있다면, 그들의user 를 통해id 속성을 정렬합니다. User 실례를 입력하고 출력하는userid값의callable 대상입니다.예를 들면 다음과 같습니다.
class User: 
    def __init__(self, user_id): 
        self.user_id = user_id
    def __repr__(self): 
        return 'User({})'.format(self.user_id)
def sort_notcompare(): 
    users = [User(23), User(3), User(99)] 
    print(users) 
    print(sorted(users, key=lambda u: u.user_id))

또 다른 방법은operator를 사용하는 것이다.lambda 함수 대신 attrgetter()를 사용합니다.
>>> from operator import attrgetter 
>>> sorted(users, key=attrgetter('user_id')) 
[User(3), User(23), User(99)] 
>>>

토론


lambda 함수를 사용하거나attrgetter () 를 선택하는 것은 개인의 취향에 따라 달라질 수 있습니다.그러나attrgetter () 함수는 보통 빨리 실행되고 여러 필드를 동시에 비교할 수 있습니다.이거랑operator.itemgetter () 함수는 사전 형식에 유사합니다. (1.13 소절 참조)예를 들어, User 인스턴스에 First 가 하나 더 있는 경우name 및 lastname 속성, 그러면 다음과 같이 정렬할 수 있습니다.
by_name = sorted(users, key=attrgetter('last_name', 'first_name'))

마찬가지로 주의해야 할 것은 이 소절에 사용된 기술은min()과max()와 같은 함수에도 적용된다는 것이다.예를 들면 다음과 같습니다.
>>> min(users, key=attrgetter('user_id')) 
User(3) 
>>> max(users, key=attrgetter('user_id')) 
User(99) 

좋은 웹페이지 즐겨찾기