리스트의 요소들을 숫자의 자릿수를 기준으로 정렬해야 하는 경우가 종종 있습니다. 이럴 때 파이썬에서는 max 함수와 더불어 sorted 메서드, lambda 함수, 그리고 문자열 메서드인 ljust를 활용하면 간단하게 해결할 수 있습니다.
예제
다음은 이를 구현한 예제입니다 −
my_list = [4344, 2611, 122, 541, 33, 892, 48292, 460, 390, 120, 10, 2909, 11239, 1]
print("The list is : ")
print(my_list)
print("The list after sorting is : ")
my_list.sort()
print(my_list)
my_temp_val = map(str, my_list)
my_max_length = max(map(len, my_temp_val))
my_result = sorted(my_list, key = lambda index : (str(index).ljust(my_max_length, 'a')))
print("The resultant list is : ")
print(my_result)
출력
The list is : [4344, 2611, 122, 541, 33, 892, 48292, 460, 390, 120, 10, 2909, 11239, 1] The list after sorting is : [1, 10, 33, 120, 122, 390, 460, 541, 892, 2611, 2909, 4344, 11239, 48292] The resultant list is : [10, 11239, 120, 122, 1, 2611, 2909, 33, 390, 4344, 460, 48292, 541, 892]
동작 원리
정수로 이루어진 리스트를 정의하고 콘솔에 출력합니다.
sort()메서드를 사용해 리스트를 오름차순으로 정렬한 뒤 콘솔에 표시합니다.map메서드를 사용해 리스트의 모든 요소를 문자열로 변환합니다.변환된 값들은 하나의 변수에 저장됩니다.
max함수로 문자열로 변환된 요소들의 최대 길이를 구해 별도의 변수에 할당합니다.sorted메서드로 리스트를 정렬하며, 이때 정렬 기준(key)은ljust로 왼쪽 정렬 처리한 값을 반환하는 람다 함수입니다.정렬된 결과는 변수에 저장됩니다.
최종 결과가 콘솔에 출력됩니다.
왜 ljust가 필요할까요?
ljust(max_length, 'a')는 각 숫자를 문자열로 변환한 뒤, 모든 문자열의 길이를 동일하게 맞추기 위해 오른쪽 끝에 'a' 문자를 채워 넣습니다. 이렇게 하면 일반적인 사전식(lexicographic) 비교가 자릿수 단위로 순서대로 진행되어 의도한 정렬 결과를 얻을 수 있습니다. 예를 들어 10은 “10aaa…”로, 1은 “1aaaa…”로 변환되는데, 두 번째 문자에서 '0'이 'a'보다 사전 순으로 앞서므로 10이 1보다 앞에 위치하게 됩니다. 덕분에 숫자의 크기가 아닌 자릿수 흐름을 기준으로 한 독특한 정렬이 가능해집니다.