(TIL) 20220526, 파이썬 2차원 배열 정렬, 람다식

2022. 5. 27. 17:08TIL(Today I learned)

반응형

🏴󠁩󠁤󠁪󠁷󠁿Facts(한 것)


  • 소프트웨어 아키텍처 공부
  • 알고리즘 문제 풀기
  • 리팩터링 독서

🏴󠁩󠁤󠁪󠁷󠁿Findings(배운 것)


최근 카카오 스타일 코딩테스트를 치면서 파이썬 람다식에 대해 좀 더 자세하게 공부할 기회가 생겼다.

 

기본적으로 람다식을 정렬 알고리즘에 많이 사용되거나 map과 같이 사용되는데,

 

이번에 가져온 알고리즘은 2차원 배열의 정렬 람다식이다.

 

2차원 배열에 대해 알기전에 파이썬 기본 정렬을 알아보자면

 

arr = [5,4,3,1,2]

arr.sort()
print(arr) 
#1, 2, 3, 4, 5

arr = sorted(arr)

#1, 2, 3, 4, 5

arr = sorted(arr, reverse = True)

#5 4 3 2 1

 

먼저 sort()의 경우, 리스트 클래스에 존재하는 메서드다.

 

또한 return을 하지 않는 메서드이기 때문에, 기존의 배열을 정렬만 한다.

 

 

sorted의 경우 Built-in 함수, 즉 기본함수로 정렬된 배열을 반환한다.

 

두 정렬의 경우 모두 오름차순으로 정렬되기 때문에, 내림차순으로 정렬하고 싶다면 reverse를 통해서 내림차순으로 정렬할 수 있다.

 

 

하지만 우리는 숫자만 비교하지 않는다. 

 

 

예를들어 문자열이 담긴 배열의 경우 알파벳 순으로 정렬할 경우, 위의 기본 정렬 함수와 메서드를 사용하면 되지만

 

길이별로 정렬해야할 경우 sort함수 하나만으론 처리가 불가능하다.

 

이때 필요한 것이 바로 lamba 식이다.

 

arr = ['apple', 'orange', 'pineapple', 'python', 'c++']

arr.sort()

print(arr)
# ['apple', 'c++', 'orange', 'pineapple', 'python']

위와 같은 배열이 있고 sort 메서드를 사용한다면 알파벳 기준으로 정렬되어 나올 것이다.

 

 

그렇다면 길이별로 정렬해야할 때는 어떻게 할 수 있을까?

 

arr = ['apple', 'orange', 'pineapple', 'python', 'c++']

arr.sort(key=lambda x : len(x))

print(arr) # ['c++', 'apple', 'orange', 'python', 'pineapple']

 

이처럼 비교에 사용될 key값을 길이로 설정해주면 길이별로 정렬이 완료된다.

 

 

그럼 2차원 배열에서 2번째 값을 기준으로 정렬하는 것은 어떨까?

 

 

arr = [[1, 10], [3, 5], [19, 7], [4, 2]]

arr.sort(key=lambda x : x[1])
# 내림차순
# arr.sort(key=lambda x : -x[1])

print(arr) # [[4, 2], [3, 5], [19, 7], [1, 10]]
#print(arr) [[1, 10], [19, 7], [3, 5], [4, 2]]

 

이렇게 원소의 두번째 값을 key값으로 삼으면 두번째 값을 기준으로 정렬이 가능하다.

 

내림차순의 경우에도 간단하게 정렬 key값에 -를 붙여주면 간단하게 해결된다.

 

 

그렇다면 2번째 값이 같을 경우는 어떻게 처리할까?

arr = [[1, 5], [3, 5], [19, 7], [4, 2]]

arr.sort(key=lambda x : (x[1], x[0]))

print(arr) #[[4, 2], [1, 5], [3, 5], [19, 7]]

 

 

위처럼 두번째 값이 같은  경우 첫번째 값으로 오름차순 정렬을 했다.

 

마찬가지로 내림차순으로 정렬하고 싶은 경우 -를 붙여주면 된다.

 

 

🏴󠁩󠁤󠁪󠁷󠁿Affirmation(자기선언)


  • 매일 알고리즘 문제 1문제 이상 풀기 -> 성공
  • 자바 8버전에 익숙해지기 -> 성공

🏴󠁩󠁤󠁪󠁷󠁿여담


 

반응형

'TIL(Today I learned)' 카테고리의 다른 글

(TIL) 20220601  (0) 2022.06.02
(TIL) 20220531  (0) 2022.06.02
(TIL) 20220523, Iterable와 Iterator  (0) 2022.05.24
(TIL) 20220521, 정적 메서드/기본 메서드, 디자인 패턴  (0) 2022.05.22
(TIL) 20220520, 나의 강점.  (0) 2022.05.21