파이썬에서 리스트를 특정 범위를 기준으로 정렬해야 하는 경우, 함수 내부에서 abs 메서드, sum 메서드, 그리고 리스트 컴프리헨션을 함께 활용하면 간결하게 해결할 수 있습니다.
아래는 실제 동작 과정을 보여주는 예제입니다.
예제 코드
def sum_range_incl(my_row):
return sum([abs(element[1] - element[0]) for element in my_row if element[0] > i and element[0] < j and element[1] > i and element[1] < j])
my_list = [[(12, 4), (55, 10), (11, 16)], [(42, 14)], [(2, 5), (2, 28), (9, 16)], [(12, 6), (6, 13)]]
print("The list is :")
print(my_list)
i, j = 2, 15
my_list.sort(key=sum_range_incl)
print("The resultant list is :")
print(my_list)
출력 결과
The list is :
[[(12, 4), (55, 10), (11, 16)], [(42, 14)], [(2, 5), (2, 28), (9, 16)], [(12, 6), (6, 13)]]
The resultant list is :
[[(42, 14)], [(2, 5), (2, 28), (9, 16)], [(12, 4), (55, 10), (11, 16)], [(12, 6), (6, 13)]]
코드 설명
'sum_range_incl'이라는 이름의 함수가 정의되며, 튜플들의 리스트를 매개변수로 받습니다.
리스트 컴프리헨션을 통해 리스트의 각 요소를 순회합니다.
각 요소에 대해 첫 번째 원소(element[1])와 0번째 원소(element[0]) 사이의 절대 차이를 계산하며, 동시에 0번째 원소가 지정된 범위(정수 i와 j 사이)에 속하는지 조건으로 검사합니다.
조건을 만족하는 값들의 합계가 함수의 반환값이 됩니다.
튜플의 리스트로 구성된 중첩 리스트를 정의하고 콘솔에 출력합니다.
범위를 나타내는 두 정수 i와 j의 값이 설정됩니다.
sort 메서드를 호출하면서 앞서 정의한 함수를 key 매개변수로 전달하여 리스트를 정렬합니다.
정렬된 최종 결과가 콘솔에 출력됩니다.
핵심 포인트
이 방식의 핵심은 sort 메서드의 key 인자에 커스텀 함수를 넘기는 것입니다. 각 하위 리스트는 범위 조건을 만족하는 튜플들의 절대 차이 합계를 기준으로 오름차순 정렬되며, 조건을 만족하지 않는 요소는 계산에서 자연스럽게 제외됩니다. 이처럼 key 함수를 직접 작성하면 단순 값 비교가 아닌 복잡한 조건 기반의 정렬도 손쉽게 구현할 수 있습니다.