준호씨의 블로그

perl - sort hash. by key, by value. hash 정렬하기. 본문

개발이야기

perl - sort hash. by key, by value. hash 정렬하기.

준호씨 2018. 7. 10. 22:09
반응형

다음과 같이 hash 데이터가 있다고 했을 때

my %fruits = (
    "apple" => 500,
    "orange" => 800,
    "kiwi" => 600,
    "ABC" => 100,
    "BBC" => 100,
);

그냥 반복문으로 찍으면 다음과 같이 나온다.

for my $fruit (keys %fruits) {
    print "$fruit, $fruits{$fruit}\n";
}

hash 데이터는 기본적으로 정렬을 보장하지 않는다.

$ perl sort.pl
BBC, 1000
kiwi, 600
apple, 500
orange, 800
ABC, 100

정렬을 해서 출력 하고 싶다면 정렬 기준을 잡아야 한다.

key 로 정렬하기. sort by key

단순한 방법이다. sort 만 넣어주면 된다.

for my $fruit (sort keys %fruits) {
    print "$fruit, $fruits{$fruit}\n";
}

그러나 기본적으로 ASCII 테이블 기반이라

ABC, 100
BBC, 100
apple, 500
kiwi, 600
orange, 800

처럼 나온다. 대소문자 상관 없이 알파벳 순으로 정렬하려고 하면 sort {lc $a cmp lc $b} 처럼 좀 더 입력 해 준다. lc (lowercase) 로 소문자로 바꿔주고 비교 하는 것이다.

for my $fruit (sort {lc $a cmp lc $b} keys %fruits) {
    print "$fruit, $fruits{$fruit}\n";
}
ABC, 100
apple, 500
BBC, 1000
kiwi, 600
orange, 800

value 로 정렬하기. sort by value

keys 대신 values 로 바꿔준다. (개인적으로 key 는 거의 항상 가져 오는 편이라 이 방식은 잘 안쓴다.)

for my $price (sort values %fruits) {
    print "$price\n";
}
100
1000
500
600
800

뭔가 좀 이상하다. 숫자로 비교 한게 아니고 ASCII 문자로 비교 했기 때문이다.

숫자로 비교 하려면 다음과 같이 한다.

for my $fruit (sort { $a <=> $b } keys %fruits) {
    print "$fruit, $fruits{$fruit}\n";
}
100
500
600
800
1000

key 를 value 를 기준으로 정렬하기.

value 를 기준으로 정렬 하면서 key 가 필요할 때는 다음과 같이 한다. 개인적으로 이 방법을 가장 많이 쓰는 편이다.

for my $fruit (sort { $fruits{$a} <=> $fruits{$b} } keys %fruits) {
    print "$fruit, $fruits{$fruit}\n";
}
ABC, 100
apple, 500
kiwi, 600
orange, 800
BBC, 1000

참고

반응형
Comments