본문 바로가기
Python

[Python] Pyhton Sort에 관하여 (cmp_to_key 활용하기)

by 마라민초닭발로제 2024. 10. 10.

개요: python에서 sort할 때 함수를 사용하고 싶을 경우가 있습니다. 가령 Swift의 경우 sorted method를 통해 sorted조건을 Custom할 수 있습니다. Python에서는 어떤 방식으로 인자를 받아서 처리하는지 궁금하여 python에 Sort에 관해 알아봤습니다. 

 

let myList = [1, 2, 3, 4, 5]
let sortedMyList = myList.sorted{($0 % 5) < ($1 % 5)}
print(sortedMyList) // [5, 1, 2, 3, 4]

 

1. 정렬하기 sort(*key=Nonereverse=False)

python에 정렬은 간단하게 만들 수 있습니다. 

nums = [1, 10, 5, 3]
nums.sort()
sortedNums = sorted(nums, reverse= True)
## [1, 3, 5, 10]
print(nums)
## [10, 5, 3, 1]
print(sortedNums)

 

 

Sort에 관하여

이 메서드는 항목 간의 < 비교만 사용하여 리스트를 제자리에서 정렬합니다. 예외는 억제되지 않습니다 - 비교 연산이 실패하면 전체 정렬 연산이 실패합니다 (리스트는 부분적으로 수정된 상태로 남아있게 됩니다).

sort() 는 키워드로만 전달할 수 있는 두 개의 인자를 받아들입니다 (키워드-전용 인자):

key 는 인자 하나를 받아들이는 함수를 지정하는데, 각 리스트 요소에서 비교 키를 추출하는 데 사용됩니다 (예를 들어, key=str.lower). 리스트의 각 항목에 해당하는 키는 한 번만 계산된 후 전체 정렬 프로세스에 사용됩니다. 기본값 None 은 리스트 항목들이 별도의 키값을 계산하지 않고 직접 정렬된다는 것을 의미합니다.

functools.cmp_to_key() 유틸리티는 2.x 스타일 cmp 함수를 key 함수로 변환하는 데 사용할 수 있습니다.

reverse 는 논리값입니다. True 로 설정되면, 각 비교가 역전된 것처럼 리스트 요소들이 정렬됩니다.

이 메서드는 큰 시퀀스를 정렬할 때 공간 절약을 위해 시퀀스를 제자리에서 수정합니다. 부작용으로 작동한다는 것을 사용자에게 상기시키기 위해 정렬된 시퀀스를 돌려주지 않습니다 (새 정렬 된 리스트 인스턴스를 명시적으로 요청하려면 sorted()를 사용하십시오).

sort() 메서드는 안정적임이 보장됩니다. 정렬은 같다고 비교되는 요소들의 상대적 순서를 변경하지 않으면 안정적입니다 — 이는 여러 번 정렬하는 데 유용합니다 (예를 들어, 부서별로 정렬한 후에 급여 등급으로 정렬).

정렬 예제와 간단한 정렬 자습서는 Sorting Techniques를 참조하십시오.

 

2. cmp_to_key를 활용하기

cmp_to_key를 활용하여 특정 Sort Method를 만들 수 있습니다. 양수를 return할경우 자리를 바꾸고, 음수를 리턴할 경우 자리를 바꾸지 않습니다. 

from functools import cmp_to_key

def mySort(x: int, y: int) :
    if str(x) + str(y) < str(y) + str(x) :
        return 1
    return -1

nums = [1, 101, 111]

nums.sort(key= cmp_to_key(mySort))
print(nums)

 

 

3. 활용하기 

프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/42746?language=python3#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

from functools import cmp_to_key

def mySort(x: int, y: int):
    if str(x) + str(y) < str(y) + str(x):
        return 1
    return -1

def solution(numbers):
    answer = ''
    numbers.sort(key= cmp_to_key(mySort))
    answer = "".join(map(str, numbers))
    return str(int(answer))

 

 

백준 https://www.acmicpc.net/problem/1422

import sys
from functools import cmp_to_key

input = sys.stdin.readline

(N, K) = map(int, input().split())

nums = []
for _ in range(N):
    nums.append(input().strip())


def sortFunc(x: str, y: str) :
    if x + y < y + x :
        return 1
    else :
        return -1

nums.sort(key=cmp_to_key(sortFunc))
res = ""

flag = False
maxVal = str(max(map(int, nums)))
for num in nums:
    if flag == False and num == maxVal :
        res += num * (K - N)
        flag = True
    res += num
print(res)

 

 

'Python' 카테고리의 다른 글

[Python] Regex HOWTO  (4) 2024.10.16