본문 바로가기
프로그래밍 언어/Python

[python] 람다(lambda) 정렬(sort)

by nahkim 2023. 1. 14.

람다 (lambda)

lambda 매개변수 : 표현식
--------------------------
def 함수이름(매개변수):
    return 결과

lambda 매개변수 : 결과

 

정렬

"-"를 붙여줄 경우 반대가 됨!

a = [값1, 값2, ...]

  • sorted
    오름 차순 : sorted(a, key = lambda x : x[0])
    내림 차순 : sorted(a, key = lambda x : -x[0])
  • sort
    오름 차순 : a.sort(key = lambda x : x[0])
    내림 차순 : a.sort(key = lambda x : -x[0])

 

인자가 2개일 경우 괄호로 묶어주며, 우선순위 순이다.
a.sort(key = lambda x : (x[0], x[1]))

 


arr = [[1,4], [3, 6], [5, 7], [4, 3]]

# 오름 차순(리스트의 첫번째값 기준으로)
arr.sort(key = lambda x : x[0])
# [[1, 4], [3, 6], [4, 3], [5, 7]]

# 내림 차순(리스트의 첫번째값 기준으로)
arr.sort(key = lambda x : -x[0])
# [[5, 7], [4, 3], [3, 6], [1, 4]]

# 오름 차순(우선 순위 1: 리스트의 첫번째값 기준, 우선 순위 2 : 리스트의 두번째값 기준)
arr.sort(key = lambda x: (x[0], x[1]))
# [[1, 4], [3, 6], [4, 3], [5, 7]]

# 오름 차순(우선 순위 1: 리스트의 두번째값 기준, 우선 순위 2 : 리스트의 첫번째값 기준)
arr.sort(key = lambda x: (x[1], x[0]))
# [[4, 3], [1, 4], [3, 6], [5, 7]]

# 리스트의 두번째 값 기준으로 오름차순 후, 첫번째 값 기준으로 오름차순
arr.sort(key = lambda x: x[1])
arr.sort(key = lambda x: x[0])
# [[4, 3], [1, 4], [3, 6], [5, 7]]
# [[1, 4], [3, 6], [4, 3], [5, 7]]

# 리스트의 첫번째 값 기준으로 오름차순 후, 두번째 값 기준으로 오름차순
arr.sort(key = lambda x: x[0])
arr.sort(key = lambda x: x[1])
# [[1, 4], [3, 6], [4, 3], [5, 7]]
# [[4, 3], [1, 4], [3, 6], [5, 7]]

 

초반 헷갈렸던 것

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

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

# 1번과 2번은 같은 값이 나옴 => 왜?

# 예시
arr = [[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]

# 1번을 할 경우
[[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]    # 우선 순위가 리스트의 첫번째를 우선순위로 함

# 2번을 할 경우
[[5, 1], [4, 2], [3, 3], [2, 4], [1, 5]]
[[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]

 

두개의 인자를 기준으로 1번 정렬하는 것과 하나의 인자로 2번 정렬하는 것이 순서가 다른 이유
1번을 보면 우선순위가 리스트의 첫번째 값이 우선으로 되야한다. x[0]을 정렬 후 x[1]을 정렬하게 되면 결과값은 결국 x[1]이 우선순위로 정렬이 된다.
그렇기에 거꾸로 해줘야 1번과 같이 우선순위 순으로 정렬된다. (나는 뒤에서 부터 정렬한다고 생각하니 이해가 편했다.)

 

예시를 보고 왜 2번처럼 정렬을 2번 하나 생각할 수 있으나 리스트에 동일한 숫자가 있을 경우 문제가 되는 경우가 있다.
내가 만약 2차원 배열로 오름 차순 정렬을 하는데 아래와 같이 arr인 경우 리스트의 첫번째 값 기준으로만 정렬이 되면 [3, 3], [3, 2] 이 부분이 정렬되지 않는 문제가 발생하여 두번째 값 기준으로도 정렬이 필요하다.

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

arr.sort(key = lambda x: x[0])
# [[1, 5], [2, 4], [3, 3], [3, 2], [5, 1]]

 

참고

https://wikidocs.net/64