Effective Python C2. 정렬 시 key 파라미터 사용.

2 분 소요

Introduction

int나 str로 이루어진 list는 따로 기준을 설정하지 않아도 정렬이 가능하다. 기본적으로 숫자는 작은 수부터 큰 수대로 정렬되고, str은 사전순으로 정렬된다.
sort 또는 sorted 메소드는 리스트의 원소를 여러 기준으로 정렬할 수 있도록 key라는 인자를 가지고 있다. key 인자를 이용해 객체의 어트리뷰트 값을 기준으로 정렬할 수도 있다.

Best WAY 14 : 복잡한 기준을 사용해 정렬할 때는 key 파라미터를 사용하라

예를 들어 다음과 같은 tools라는 객체가 있다.

class Tool:
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

    def __repr__(self):
        return f'Tool({self.name}, {self.weight}'

tools = [
    Tool('온도계', 0.5),
    Tool('망치', 1.25),
    Tool('체중계', 2.25),    
]

이 tools 객체를 정렬하려면, 기준이 있어야 한다. 기준을 정하기 위해 key 파라미터를 사용한다. 이때 key 파라미터에는 함수가 들어가야 하는데, 보통 정렬을 위한 일회용 함수를 필요로 하는 경우가 많아 lambda 함수를 사용한다.

# weight에 따라 정렬함.
tools.sort(key=lambda x: x.name)
>>>
[Tool('망치', 1.25), Tool('온도계', 0.5), Tool('체중계', 2.25)]

문자열의 경우 이를 응용하여 대소문자 구별없이 정렬이 가능하다.

places = ['home', 'work', 'New York', 'Paris']
places.sort(key=lambda x: x.lower())

>>>
['home', 'New York', 'Paris', 'work']

여러 기준이 필요할 경우 다음과 같이 튜플을 이용해 사용이 가능하다.
예시는 길이순으로 먼저 정렬하고 그다음 대소문자 구별없이 사전 순으로 정렬하는 것이다. 튜플에서 앞에 있는 원소가 우선 순위를 가진다.

places.sort(key=lambda x: (len(x), x.lower()))
>>>
['home', 'work', 'Paris', 'New York']

만약 특정 기준에 대해 역순으로 정렬하고 싶다면 부호를 추가하면 된다.

places.sort(key=lambda x: (-len(x), x.lower()))
>>>
['New York', 'Paris', 'home', 'work']

Summary

  • key 파라미터를 이용해 객체의 어트리뷰트에 접근하여 정렬이 가능하다.
  • 튜플을 이용해 여러 기준을 적용할 수 있다.
  • 역순으로 정렬 시 부호를 추가한다.

Reference

파이썬 코딩의 기술 제 2판. - 브렛 슬리킨 지음 / 오현석 옮김