Javascript Python 숫자, 문자열 정렬하기(sort) 정리

Javascript(자바스크립트)Python(파이썬)에서 숫자와 문자열의 정렬(sort)을 정리해 봤습니다. 구글링하면서 연구한 내용을 적은거라 잘못된 부분이 있을 수 있습니다. 😅

Javascript의 숫자 정렬

Javascript는 배열의 sort 함수를 이용해서 정렬을 합니다. 이 때 인수로 비교함수(compareFn)을 전달해 줍니다. 비교함수는 두 수를 비교한 결과값을 반환해줍니다. (오름차순 기준으로) 왼쪽이 크면 양수, 작으면 음수를 반환합니다. 두 수의 값이 같을 때는 0을 반환합니다.

function compare(a, b) {
  if (a > b) return 1;
  if (a < b) return -1;
  return 0;
}
var nums = [2, 4, 1, 5, 3];
nums.sort(compare);
console.log(nums.join(", "));
1, 2, 3, 4, 5

arrow function을 사용해서 간단하게 적을 수 있습니다.

var nums = [2, 4, 1, 5, 3];
// 오름차순 정렬
nums.sort((a, b) => a - b);
console.log(nums.join(", "));
// 내림차순 정렬
nums.sort((a, b) => b - a);
console.log(nums.join(", "));
1, 2, 3, 4, 5
5, 4, 3, 2, 1

Javascript의 문자열 정렬

localeCompare 함수를 사용하면 간단합니다.

var words = ["KIWI", "apple", "melon", "Apple", "Pear"];
// 오름차순 정렬
words.sort((a, b) => a.localeCompare(b));
console.log(words.join(", "));
// 내림차순 정렬
words.sort((a, b) => b.localeCompare(a));
console.log(words.join(", "));
apple, Apple, KIWI, melon, Pear
Pear, melon, KIWI, Apple, apple

(오름차순 기준) 단어가 같을 경우 소문자가 먼저 나오게 되는데, 대문자를 먼저 나오게 하려면 caseFirst 옵션을 "upper"로 주면 됩니다. (사전순 정렬)

var words = ["KIWI", "apple", "melon", "Apple", "Pear"];
words.sort((a, b) => a.localeCompare(b, "en", {caseFirst:"upper"}));
console.log(words.join(", "));
Apple, apple, KIWI, melon, Pear

"Apple"이 "apple"보다 앞에 오게 되었습니다.
(※ 옵션을 주기 위해서는 locale을 두번째 인수로 전달해 줘야 하는데, "en"이나 "ko"를 적어주면 됩니다. 위의 경우에는 차이가 없지만, 영어단어와 한글단어가 섞여 있는 경우에는 locale값이 순서에 영향을 줍니다.)

Python의 숫자 정렬

Python의 정렬은 list의 sort함수(또는 sorted함수)를 이용합니다. Javascript와는 다르게 비교함수를 전달해 주지 않고, 경우에 따라 key 인수를 전달해 줍니다. 숫자를 정렬할 때는 key를 전달해주지 않아도 됩니다. 내림차순 정렬일 경우에는 reverse를 True로 해줍니다.

nums = [2, 4, 1, 5, 3]
# 오름차순 정렬
nums.sort()
print(nums)
# 내림차순 정렬
nums.sort(reverse=True)
print(nums)
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]

Python의 문자열 정렬

문자열을 정렬할 때는 key에 casefold 함수를 전달해줍니다. (upper나 lower도 가능한데 casefold가 더 알맞다고 하네요.)

words = ["KIWI", "apple", "melon", "Apple", "Pear"]
# 오름차순 정렬
words.sort(key=str.casefold)
print(words)
# 내림차순 정렬
words.sort(key=str.casefold, reverse=True)
print(words)
['apple', 'Apple', 'KIWI', 'melon', 'Pear']
['Pear', 'melon', 'KIWI', 'apple', 'Apple']

casefold는 문자열을 소문자로 만들기 때문에, 정렬할때 "apple"과 "Apple"을 같은 단어로 인식해서 순서를 변경하지 않습니다. 대문자를 먼저 나오게 하려면 tuple을 이용하면 됩니다. tuple은 첫번째 원소가 같을때는 두번째 원소를 이용해서 정렬이 됩니다. (사전순 정렬)

words = ["KIWI", "apple", "melon", "Apple", "Pear"]
words.sort(key=lambda s:(s.casefold(), s))
print(words)
['Apple', 'apple', 'KIWI', 'melon', 'Pear']

tuple 의 두번째 원소로 단어 원본(s)을 주었고, "Apple"이 "apple"보다 앞에 나오게 됩니다. (소문자를 먼저 나오게 하려면 s 대신에 s.swapcase() 를 적으면 됩니다.)

Python 비교함수 이용해서 정렬하기

Python 정렬에서 Javascript처럼 비교함수를 이용해야 할 경우에는 functools 모듈을 이용하면 됩니다.

import functools
nums = [2, 4, 1, 5, 3]
nums.sort(key=functools.cmp_to_key(lambda a, b: a - b))
print(nums)
[1, 2, 3, 4, 5]