코딩테스트에서 간간히 나오는 유형이라 모르고 지나칠 수가 없는... 근데 헤깔리는...
1차원 배열을 정렬하는 것은 매우 쉽다.
[1차원 배열] Ascending Sort, 오름차순(1,2,3,...) 정렬
arr = [5,2,3,1,4]
# 1번 방법
sorted(arr) # 출력 : [1,2,3,4,5]
# 2번 방법
arr.sort() # 출력 : [1,2,3,4,5]
sorted(배열명) 이나 배열명.sort()를 사용하면 된다. 숫자, 문자, 문자열 전부 상관없이 오름차순 정렬이 된다.
다만, 대소문자가 섞여있는 배열에는 대문자 오름차순 > 소문자 오름차순 으로 정렬된다. (문자를 아스키코드 값에 대응하기 때문)
이 두 내장 메소드의 차이점은 분명해서 언제 사용할지 분명히 나누어진다.
sorted(arr) : arr 배열을 변형하지 않고, arr 배열이 오름차순으로 정렬된 새로운 배열을 반환한다.
arr.sort() : arr 배열을 오름차순으로 변형하고 반환하지는 않는다.
arr = [5,2,3,1,4]
# sorted() : 변형 X, 정렬된 새로운 배열 반환
print(sorted(arr)) # 출력 : [1,2,3,4,5]
print(arr) # 출력 : [5,2,3,1,4]
# sort() : 변형 O, 반환 값은 없음
print(arr.sort()) # 출력 : None
arr.sort()
print(arr) # 출력 : [1,2,3,4,5]
기존 배열이 변형이 되어도 상관이 없으면 sort(),
기존 배열을 유지한 채로 정렬한 배열이 필요하다면 새로운 배열에 sorted() 값을 반환받아 사용하면 된다.
[1차원 배열] Descending Sort, 내림차순(5,4,3,...) 정렬
sort(), sorted() 에는 옵션 매개변수 reverse(필요에 의해 사용하는)가 존재한다.
기본값은 reverse = False (오름차순) 이고 필요에 의해 reverse = True (내림차순) 로 작성해 사용하면 된다.
arr = [5,2,3,1,4]
print(sorted(arr, reverse=True)) # 출력 : [5,4,3,2,1]
arr.sort(reverse=False) # 출력 : [5,4,3,2,1]
arr.sort() # 출력 : [1,2,3,4,5]
arr.sort() | arr.sort(reverse = True) 같은거임
[2차원 배열] 정렬
2차원 배열은 원하는 Key 값을 이용해 정렬을 할 수 있다.
1. sorted() 사용
# 오름차순
sorted(배열명, key=lambda x:x[n]) : n번째 요소를 기준으로 정렬하고 싶어여
# 내림차순
sorted(배열명, key=lambda x:x[n], reverse=True) : n번째 요소를 기준으로 거꾸로 정렬하고 싶어여
key=lambda 에서 lambda가 뭐냐 하면은... lambda는 익명함수다.
우리가 합계를 구하는 함수를 작성할 때 def Sum(a,b): return a+b 이렇게 작성해서 sum = Sum(1,4) 이렇게 쓰는 대신에,
sum = (lambda x,y: x+y)(1,4) 이렇게 써서 바로 사용하는 것이다.
굳이? 라는 생각이 들 수 있지만 배열을 정렬할 때는 lambda 를 사용해 정렬 키를 쓴다 정도만 알아두면 될 듯하다.
student_score = [['임천재', 100],['김천재', 96],['박바보',24],['임바보',22],['김바보',26],['박천재',90]]
# 이름을 기준으로 정렬 : x[0]
sorted_list = sorted(student_score, key=lambda x:x[0])
print(sorted_list)
# [['김바보', 26], ['김천재', 96], ['박바보', 24], ['박천재', 90], ['임바보', 22], ['임천재', 100]]
# 성적을 기준으로 정렬(오름차순) : x[1]
sorted_list = sorted(student_score, key=lambda x:x[1])
print(sorted_list)
# [['임바보', 22], ['박바보', 24], ['김바보', 26], ['박천재', 90], ['김천재', 96], ['임천재', 100]]
# 성적을 기준으로 정렬(내림차순) : x[1]
sorted_list = sorted(student_score, key=lambda x:x[1], reverse=True)
print(sorted_list)
# [['임천재', 100], ['김천재', 96], ['박천재', 90], ['김바보', 26], ['박바보', 24], ['임바보', 22]]
2. sort() 사용
# 오름차순
배열명.sort(key=lambda x:x[n]) : n 번째 원소를 기준으로 정렬하고 싶어여
# 내림차순
배열명.sort(key=lambda x:x[n], reverse=True) : n 번째 원소를 기준으로 거꾸로 정렬하고 싶어여
student_score = [['임천재', 100],['김천재', 96],['박바보',24],['임바보',22],['김바보',26],['박천재',90]]
# 기본 값 : 각 배열의 가장 첫번째 요소를 기준으로 정렬함
student_score.sort()
print(student_score)
# [['김바보', 26], ['김천재', 96], ['박바보', 24], ['박천재', 90], ['임바보', 22], ['임천재', 100]]
# 이름으로 정렬 : x[0] 요소 기준
student_score.sort(key = lambda x:x[0])
print(student_score)
# [['김바보', 26], ['김천재', 96], ['박바보', 24], ['박천재', 90], ['임바보', 22], ['임천재', 100]]
# 점수로 정렬(오름차순) : x[1] 요소 기준
student_score.sort(key = lambda x:x[1])
print(student_score)
# [['임바보', 22], ['박바보', 24], ['김바보', 26], ['박천재', 90], ['김천재', 96], ['임천재', 100]]
# 점수로 정렬(내림차순) : x[1] 요소 기준
student_score.sort(key = lambda x:x[1], reverse=True)
print(student_score)
# [['임천재', 100], ['김천재', 96], ['박천재', 90], ['김바보', 26], ['박바보', 24], ['임바보', 22]]
만약, 정렬하려는 key값이 동일한 경우는 (정렬 key 사용하지 않을 때 : sort()만 사용) 자동적으로 그 다음 키 값에 따라 정렬한다.
student_score = [['김천재', 100],['김천재', 96],['박바보',24],['박바보',22],['박바보',26],['김천재',90]]
student_score.sort()
print(student_score)
# [['김천재', 90], ['김천재', 96], ['김천재', 100], ['박바보', 22], ['박바보', 24], ['박바보', 26]]
[문자열] 정렬
엄밀히 말하면 문자열을 배열로 바꿔서 정렬하는 것이다.
단, sort() 대신에 sorted()를 사용해 값을 반환받아 사용해야 한다.
s = "I'm like chardonnay, get better over time"
new_s = sorted(s.split())
print(new_s)
# ["I'm", 'better', 'chardonnay,', 'get', 'like', 'over', 'time']
근데, 여기서 엥? 왜 저렇게 정렬되지 하는 똑똑새들이 있을텐데, I가 대문자라 가장 먼저 나오는 것이다.
s = "I'm like chardonnay, get better over time"
new_s = sorted(s.split(), key=str.lower)
print(new_s)
# ['better', 'chardonnay,', 'get', "I'm", 'like', 'over', 'time']
key에 lambda가 아닌 str.lower(소문자로 바꿔서 생각하겠다는 듯)을 사용하면 된다.
딕셔너리(해시)는 다음에!
'Python > [re-Python] 파이썬 기본' 카테고리의 다른 글
[re-Python] 사용자 입출력 (0) | 2022.04.05 |
---|---|
[re-Python Basic] 리스트, 딕셔너리, 집합 (0) | 2022.04.05 |
[re-Python Basic] 문자열 (0) | 2022.04.01 |