파이썬 코드를 작성하다보면, 정렬이 필요한 경우가 심심찮게 생긴다.
그런 경우에 간단하게 사용할 수 있는 함수를 소개한다.
sort()와 sorted()이다.
sort()는 sort를 해준다.
입력으로는 list가 들어가게 된다.
너무 간단하기 때문에 특별한 설명 없이 코드를 확인해보자.
list = ['f', 's', 'g', 'j', 'a']
list.sort()
결과는 ['a', 'f', 'g', 'j', 's']이 나온다.
여기서 확인할 수 있는 sort()의 특성이 두 개가 있다.
1. list에 사용할 수 있다. 문자열에는 사용할 수 없다.
2. 반환값이 없다. 제자리 정렬(In-Place sort)이라고도 한다.
sorted()는 문자열 또는 리스트를 입력으로 받아 sort된 결과를 list로 반환한다.
앞서 확인한 list.sort()와는 다르게 문자열에도 사용할 수 있으며, 반환값이 존재한다. 또한 sort해야하는 문자열 또는 list가 인자로 들어간다.
코드로 확인해보자.
str = "fsgja"
result_list = sorted(str)
결과는 다음과 같다.
['a', 'f', 'g', 'j', 's']
그런데 문자열을 입력했는데, 리스트로 반환된다면 이를 다시 문자열로 변환하는 과정이 필요할 수 있다. 그런경우 "".join()의 방식으로 변환한다.
sorted_str = "".join(sorted(str))
결과로는 문자열 "afgjs"가 반환된다.
list = ['f', 's', 'g', 'j', 'a']
result_list = sorted(list)
리스트가 들어가면, 앞선 문자열이 인자로 들어간 경우와 동일하게 리스트로 반환된다.
sorted에는 key가 명시될 수 있다. 대표적인 예로 문자열의 길이 len이 키로 들어가 문자열의 길이 순서로 sort를 할 수 있다.
코드로 확인해보자!
list = ["aaa", "dd", "c", "bbbb"]
sorted_list = sorted(list, key=len)
결과는 ['c', 'dd', 'aaa', 'bbbb']이다.
만약 key=len이라는 두 번째 인자가 적용되지 않았다면, 결과는 알파벳 순서였을 것이다.
조금 더 복잡하게 들어가보자!
sorted의 두 번째 인자로 key가 들어갈 수 있음은 앞선 길이 기준 sort 예시에서 확인하였다. 다음으로 맨앞, 맨뒤 문자를 기준으로 sort를 하는 방법이 있을 수 있다.
특정 기준을 적용한 함수를 하나 만들고 해당 함수를 key= 뒤에 붙여주면 된다. 여기서는 맨 앞, 맨 뒤 문자를 가리키기 위해 s[0], s[-1]을 적용한다.
a = ['cdr', 'cfc', 'abc']
# 첫 문자열과 마지막 문자열을 기준으로 정렬되도록 한다.
def fn(s):
return s[0], s[-1]
print(sorted(a, key=fn))
fn함수의 결과로 반환되는, s[0], s[-1]을 기준으로 리스트가 sort되어, 결과는 ['abc', 'cfc', 'cdr']가 된다. 가운데 문자도 sort과정에 반영됐다면, 'cfc'보다 'cdr'이 앞에 왔을 것이다.
람다를 사용하면 이를 한 줄의 코드로 단순화할 수 있다.
a = ['cdr', 'cfc', 'abc']
print(sorted(a, key = lambda s: (s[0], s[-1])))
앞선 예시에 lambda를 사용하여 한 줄로 간단하게 만들었다.
sort와 sorted의 차이를 다시 정리해본다.
1. sort는 문자열이 적용될 수 없지만, sorted에는 적용 가능하다.
2. sort는 in-place sort로 반환값이 없지만, sorted는 반환값이 있다.
알고리즘 테스트, 프로그래밍 어디에서도 sort는 빠지지 않고 나오는 주제다. 이를 명확하게 이해하고 사용할 수 있으면 좋을 거 같다!