[Python] 정렬

김영후·2022년 11월 26일
0

Python 회고록

목록 보기
2/5

PS에서 정렬은 중요한 것 같다. 나는 Python으로 PS를 준비하고 있기에 sort(), sorted()를 활용할 일이 많았다. 이때까지는 그냥 둘 중에 생각나는대로 쓰곤 했는데, 이게 다 따로 만들어져 있는 이유가 있는 거였다. 우선 list의 내장함수인 sort()에 대해서 알아보자.

sort()

a = [1, 3, 5, 4]
a.sort()
print(a)
#[1, 3, 4, 5]

와 같이 사용한다. sort()는 해당 리스트 자체를 변경해버리는 함수이다. 이게 무슨 말인지 모르겠다면, sorted()를 한 번 보고나서 다시 이야기해보자.

sorted()

a = [1, 3, 5, 4]
b = sorted(a)
print(a)
print(b)
#[1, 3, 5, 4]
#[1, 3, 4, 5]

sorted()는 a를 정렬한 것을 반환하고, a는 원래 형태를 유지한다. 해당 리스트 자체의 변경은 없는 것이다. 또한, sorted()는 list의 내장 함수가 아니므로 iterable한 객체에 대해서는 모두 사용이 가능하다(sort()는 list의 내장 함수이므로 list에만 사용 가능). 그러나 반환형은 list임을 알아야한다.

a = {"kim": 26, "park": 23, "cho": 28, "lee": 30}
print(sorted(a))
#['cho', 'kim', 'lee', 'park']

dictionary에 sorted()를 사용했을 때, 반환되는 값은 사전식 순서의 key들이 담긴 list이다.

key parameter
sort(), sorted()는 사용 시 key를 줄 수 있다. 우선 sort()의 prototype을 보자.

list.sort(key=(function), reverse=(bool))

key에는 function을 쓰게 되어있다. 이 때 간단한 정렬을 위해서는 function을 만들어 쓰기보다는 lambda expressioin이 자주 사용된다.

a = ["bca", "b", "ett", "abcde"]
a.sort(key=lambda word: len(word))	# 길이 순 정렬
print(a)
#['b', 'bca', 'ett', 'abcde']

b = ["bca", "b", "ett", "abcde"]
b.sort(key=lambda word: word[0])	# 맨 앞글자 기준 사전순 정렬
print(b)
#['abcde', 'bca', 'b', 'ett']

c = ["be", "bca", "ett", "azcde"]
c.sort(key=la mbda wrd: word[1])	# 두 번째 글자 기준 사전순 정렬
print(c)
#['bca', 'be', 'ett', 'azcde']

reverse의 경우는 True값을 줬을 시에 역순 정렬을 해준다. 기본 값은 False이다.
sorted의 경우 prototype은

list2 = sorted(list1, key=(function), reverse=(bool))

이다. 예시를 보자면 아래와 같은데,

a = ["bca", "b", "ett", "abcde"]
a = sorted(a, key=lambda word: len(word))	# 길이 순 정렬
print(a)
#['b', 'bca', 'ett', 'abcde']

이와 같이 사용하면 된다.

key값은 하나만 줄 수 있는 게 아니라 여러개를 줄 수도 있다. 정렬의 기준이 여러개 있고 우선순위가 있다면 이를 사용하면 편리할 것이다. 예시로는,

a = [("kim", 25), ("park", 2), ("lee", 30), ("cho", 37), ("cho", 30), ("kim", 20)]
a.sort(key = lambda x: (x[1], x[0]))	# 튜플의 두 번째 인자를 기준으로 먼저 정렬, 두 번째 인자가 같다면 첫 번째 인자를 기준으로 정렬
print(a)
#[('park', 2), ('kim', 20), ('kim', 25), ('cho', 30), ('lee', 30), ('cho', 37)]

b = [("kim", 25), ("park", 2), ("lee", 30), ("cho", 37), ("cho", 30), ("kim", 20)]
b.sort(key = lambda x: (x[1], x[0]))	# 튜플의 첫 번째 인자를 기준으로 먼저 정렬, 두 번째 인자가 같다면 두 번째 인자를 기준으로 정렬
print(b)
#[('cho', 30), ('cho', 37), ('kim', 20), ('kim', 25), ('lee', 30), ('park', 2)]

이런 식으로 이용이 가능하다. sort()와 sorted()의 차이점, 둘의 사용법에 대해서 알아보았다!

profile
PNU CSE 16th / Busan, South Korea

0개의 댓글