개요: 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=None, reverse=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 |
---|