[파이썬] 파이썬 정렬, 다중 조건 정렬, 람다(lambda)

미음제

·

2021. 7. 20. 16:26

프로그래머스 Level 2

"방금그곡"이라는 문제를 풀면서

마지막 부분에서

정렬이 필요했다.

 

결과를 담은 배열에서

결과가 하나 뿐이라면

단순히 해당 배열에서 제목을 리턴해 주면 되지만

결과를 담은 배열의 크기가

2 이상일 때

재생된 시간이 긴 음악, 먼저 입력된 음악 순으로

정렬을 한 뒤 제목을 리턴해 주어야 했다.

 

# 중략

# 배열에 음악의 재생 시간, 입력된 순서, 제목을 입력
answer.append([time, index, music[2]])

# 중략

# 결과배열이 비어있다면 "None" 리턴
    if not answer:
        return "(None)"
    # 결과배열의 크기가 1이라면 제목 리턴
    elif len(answer) == 1:
        return answer[0][2]
    # 결과 배열의 크기가 2보다 크다면 재생된 시간이 긴 음악, 먼저 입력된 음악순으로 정렬
    else:
        answer = sorted(answer, key=lambda x: (-x[0], x[1]))
        return answer[0][2] # 첫번째 제목을 리턴

 

위 방식으로 정렬을 하기 위해

lambda를 사용해 정렬을 했는데

lambda에 대해 깔끔하게 설명이 된 블로그가 있어

해당 블로그를 참고해 문제를 해결할 수 있었다.


다음은 블로그에서 참고한 내용으로

파이썬에서 정렬을 하는 방법에 대해 설명한다.

 

파이썬 정렬, 다중 조건으로 정렬

 

파이썬으로 문제를 풀다 보면, 여러 조건으로 소팅을 해야 하는 경우가 있다.
일반적인 소팅은 다음과 같이 sorted() 혹은 .sort()를 사용한다.

a = [4,1,2,5,7,3,6]
b = sorted(a)
# b = [1,2,3,4,5,6,7]

sorted()를 살펴보면 다음과 같다.

a = [(1, 2), (0, 1), (5, 1), (5, 2), (3, 0)]

# 인자없이 그냥 sorted()만 쓰면, 리스트 아이템의 각 요소 순서대로 정렬을 한다.
b = sorted(a)
# b = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]

# key 인자에 함수를 넘겨주면 해당 함수의 반환값을 비교하여 순서대로 정렬한다.
c = sorted(a, key = lambda x : x[0])
# c = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
d = sorted(a, key = lambda x : x[1])
# d = [(3, 0), (0, 1), (5, 1), (1, 2), (5, 2)]

# 아이템 첫 번째 인자를 기준으로 오름차순으로 먼저 정렬하고,
# 그리고 그 안에서 다음 두 번째 인자를 기준으로 내림차순으로 정렬하게 하려면, 다음과 같이 할 수 있다.
e = [(1, 3), (0, 3), (1, 4), (1, 5), (0, 1), (2, 4)]
f = sorted(e, key = lambda x : (x[0], -x[1]))
# f = [(0, 3), (0, 1), (1, 5), (1, 4), (1, 3), (2, 4)]

 

요약

 

sorted()의 key 인자로, 내가 커스텀할 비교 함수를 보내주면 넣어주면 된다.

✔ 비교 함수는 비교할 아이템의 요소를 반환하면 된다.

✔ 비교 함수는 익명 함수(lambda)도 가능하고, 별도로 정의해도 된다.

✔ 비교할 아이템의 요소가 복수 개일 경우, 튜플로 그 순서를 내보내 주면 된다.

✓ ex) sorted(e, key = lambda x : (x[0], -x[1]))

✓ '-' 기호를 붙이면, 현재 정렬차순과 반대로 하게 된다.

 

참고 블로그

https://dailyheumsi.tistory.com/67#comment14144077

 

파이썬 정렬, 다중 조건으로 한 번에 하기.

파이썬으로 문제를 풀다보면, 여러 조건으로 소팅을 해야하는 경우가 있다. 일반적인 소팅은 다음과 같이 sorted() 혹은 .sort() 를 사용한다. a = [4,1,2,5,7,3,6] b = sorted(a) # b = [1,2,3,4,5,6,7] sorted()..

dailyheumsi.tistory.com

 

반응형