본문 바로가기

환영합니다. 이 블로그 번째 방문자입니다.
Python/[re-Python] 파이썬 기본

[re-Python] 문자열, 배열 정렬 (sort, sorted)

코딩테스트에서 간간히 나오는 유형이라 모르고 지나칠 수가 없는... 근데 헤깔리는...


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(소문자로 바꿔서 생각하겠다는 듯)을 사용하면 된다. 

딕셔너리(해시)는 다음에!