리스트(행렬) 안에 여러 개의 행이 있을 때, 각 행에서 인접한 두 요소 간 차이의 절댓값 합을 기준으로 행들을 오름차순으로 정렬해야 하는 경우가 있습니다. 파이썬에서는 사용자 정의 함수를 만들고 이를 sort() 메서드의 key 인자로 전달하는 방식으로 손쉽게 구현할 수 있습니다.
예제 코드
아래 예제는 위 방식을 실제로 구현한 것입니다.
def diff_summation_elem(row):
return sum([abs(row[index + 1] - row[index]) for index in range(0, len(row) - 1)])
my_list = [[97, 6, 47, 3], [6, 88, 3, 26], [71, 53, 34, 65], [15, 36, 5,62]]
print("The list is : ")
print(my_list)
my_list.sort(key=diff_summation_elem)
print("The resultant list is :" )
print(my_list)실행 결과
The list is : [[97, 6, 47, 3], [6, 88, 3, 26], [71, 53, 34, 65], [15, 36, 5, 62]] The resultant list is : [[71, 53, 34, 65], [15, 36, 5, 62], [97, 6, 47, 3], [6, 88, 3, 26]]
코드 설명
먼저
diff_summation_elem이라는 이름의 함수를 정의합니다. 이 함수는 하나의 리스트(행)를 매개변수로 받습니다.함수 내부에서는 리스트 컴프리헨션(list comprehension)과 함께 내장 함수인
abs()와sum()을 사용하여, 리스트를 순회하면서 인접한 두 요소의 차이 절댓값을 모두 더한 값을 반환합니다.함수 외부에서는 리스트 안에 리스트가 포함된 중첩 리스트(행렬)를 정의하고, 이를 콘솔에 출력합니다.
sort()메서드를 호출할 때key인자로 앞서 정의한 함수를 지정하면, 각 행은 '인접 요소 차이의 합'을 기준으로 오름차순 정렬됩니다.마지막으로 정렬된 결과 리스트를 콘솔에 출력합니다.
정렬 기준 계산 과정 살펴보기
결과를 더 명확히 이해하기 위해 각 행의 차이 합을 직접 계산해 보겠습니다.
[71, 53, 34, 65] → |53-71| + |34-53| + |65-34| = 18 + 19 + 31 = 68
[15, 36, 5, 62] → |36-15| + |5-36| + |62-5| = 21 + 31 + 57 = 109
[97, 6, 47, 3] → |6-97| + |47-6| + |3-47| = 91 + 41 + 44 = 176
[6, 88, 3, 26] → |88-6| + |3-88| + |26-3| = 82 + 85 + 23 = 190
따라서 차이 합이 작은 순서대로 68 → 109 → 176 → 190 순으로 행이 배치되어, 실행 결과와 일치함을 확인할 수 있습니다.