본문으로 바로가기

sort 비교 함수 정의하기

category Tcl & Tk/팁 (Tip) 2025. 3. 14. 12:27

예를 들어 아래와 같은 리스트가 있다고 보죠.

set list [list sum_r_0_ sum_r_1_ sum_r_10_ sum_r_11_ sum_r_12_ sum_r_13_ sum_r_14_ sum_r_15_ sum_r_2_ sum_r_3_ sum_r_4_ sum_r_5_ sum_r_6_ sum_r_7_ sum_r_8_ sum_r_9_]

 

위와 같은 특별한 리스트의 경우 예를 들어 중간에 숫자가 나온다던지.. 이런 경우 소트를 하고 싶다면 lsort의 -command 옵션을 사용합니다. 우선 아래와 같은 소트 함수를 만듭니다.

# 숫자를 분리후 서로 비교합니다.
proc compare {one two} {
        set one [lindex [split $one _] end-1]
        set two [lindex [split $two _] end-1]
        if { $one < $two } {
                return -1
        } elseif { $one > $two} {
                return 1
        } else {
                return 0
        }
}

 

다음 lsort를 호출합니다.

set sorted [lsort -command compare $list]
puts $sorted

 

결과는 다음과 같습니다.

sum_r_0_ sum_r_1_ sum_r_2_ sum_r_3_ sum_r_4_ sum_r_5_ sum_r_6_ sum_r_7_ sum_r_8_ sum_r_9_ sum_r_10_ sum_r_11_ sum_r_12_ sum_r_13_ sum_r_14_ sum_r_15_