HOWTO · Python

Python의 사전식 순서

이 튜토리얼은 Python의 사전식 순서가 무엇인지 보여줍니다.

이 페이지의 내용

Python에서 사전식 순서는 문자열을 Unicode 코드 포인트에 따라 왼쪽에서 오른쪽으로 비교합니다. 처음으로 다른 문자가 순서를 결정하고, 한 문자열이 다른 문자열의 접두사라면 더 짧은 문자열이 먼저 옵니다. 목록을 제자리에서 재정렬하려면 sort()를, 정렬된 결과를 새로 만들려면 sorted()를 사용하세요. 다른 비교 규칙이 필요하면 키 함수를 지정하면 됩니다.

Python에서 사전식 순서란

사전식 순서는 항목을 왼쪽에서 오른쪽으로 차례로 비교하는 방식입니다. 두 항목이 처음으로 달라지는 위치에서 값이 더 작은 항목이 먼저 오고, 한 항목이 다른 항목의 접두사라면 더 짧은 항목이 먼저 옵니다. Python은 문자열을 Unicode 코드 포인트에 따라 비교하므로 대소문자를 구분하며, 그 결과는 독자가 기대하는 언어별 알파벳순과 다를 수 있습니다. 대소문자를 구분하지 않고 정렬하려면 str.casefold처럼 명시적인 키를 선택하세요.

문자열과 단어를 사전식으로 정렬하기

list.sort()는 목록을 제자리에서 재정렬합니다. 반환값은 None입니다. 원래 반복 가능한 객체를 그대로 두고 새 목록이 필요하다면 sorted()를 사용하세요. 키를 지정하지 않으면 Python은 문자열을 문자 단위로 비교합니다.

다음 예제를 실행해 보세요. 코드와 출력은 원문 그대로이며, 코드에 포함된 영어 문자열도 유지됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

names = ["pear", "apple", "orange"]
names.sort()
print(names)
['apple', 'orange', 'pear']

선택 사항인 key 매개변수로 비교에 사용할 값을 지정할 수 있습니다. 예를 들어 sorted(names, key=str.casefold)는 대문자와 소문자를 구분하지 않고 정렬합니다. 저장된 문자열 자체가 바뀌는 것은 아닙니다.

문장 속 단어를 정렬하려면 먼저 문장을 목록으로 나누세요. 이 예제의 코드와 출력도 원문 그대로이며, 코드에 포함된 영어 문자열을 유지합니다.

sentence = "pear apple orange"
words = sentence.split()
words.sort()
print(words)
['apple', 'orange', 'pear']

split()는 기본적으로 연속된 공백을 기준으로 나눕니다. 이렇게 얻은 단어를 정렬하면 순서가 정해진 목록이 반환되지만, 구두점을 별도 토큰으로 보존하거나 문장을 원래 공백까지 살려 재구성하지는 않습니다. 이런 세부 사항이 중요하다면 필요한 규칙에 맞춰 텍스트를 토큰화하고 형식을 지정하세요.

문자열의 문자 정렬하기

문자열은 변경할 수 없으므로 sorted()로 문자를 정렬한 다음, 결과 목록을 join()하여 새 문자열을 만드세요. 이 예제의 코드와 출력은 원문 그대로이며, 코드에 포함된 영어 문자열도 유지됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

word = "delftstack"
ordered_word = "".join(sorted(word))
print(ordered_word)
acdefklstt

결과는 언어별 알파벳 정렬 규칙이 아니라 코드 포인트 순서를 따릅니다. 반복되는 문자는 그 횟수만큼 그대로 남습니다. 대소문자를 구분하지 않는 정렬이 목적이라면 sorted()에 키를 전달하세요. 특정 언어의 정렬 규칙을 따라야 한다면 코드 포인트 순서가 그 규칙과 일치한다고 가정하지 말고 정렬 라이브러리를 사용하세요.

숫자는 사전식 순서가 아니라 숫자값으로 정렬하기

Python은 정수를 숫자값으로 비교합니다. 따라서 2가 10보다 먼저 옵니다. 이 값을 문자열로 변환하면 문자 단위 비교가 적용되어 "10"이 "2"보다 먼저 오게 됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

numbers = [1, 4, 5, 3, 10, 16, 12]
original = numbers.copy()
numbers.sort()
new_numbers = sorted(original)
print(numbers)
print(new_numbers)
print(original)
[1, 3, 4, 5, 10, 12, 16]
[1, 3, 4, 5, 10, 12, 16]
[1, 4, 5, 3, 10, 16, 12]

위 두 정렬 호출은 모두 숫자를 오름차순으로 정렬합니다. sort()는 목록을 변경하고, sorted()는 별도의 목록을 반환합니다. 숫자로 된 문자열을 값에 따라 정렬하려면 sorted(values, key=int)처럼 키에서 숫자로 변환하세요. 원래 문자열의 서식이 중요하다면 문자열은 그대로 보관할 수 있습니다.

선택한 필드로 튜플 정렬하기

기본적으로 튜플은 필드를 차례로 비교하는 사전식 순서로 정렬됩니다. Python은 첫 번째 필드를 비교하고, 앞선 필드의 값이 같으면 다음 필드를 비교합니다. 특정 필드를 우선 기준으로 삼으려면 키 함수를 전달하세요. itemgetter(1)는 두 번째 필드(인덱스 1)를 선택합니다. 이 예제의 코드와 출력은 원문 그대로이며, 코드에 포함된 영어 문자열도 유지됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from operator import itemgetter

produce = [(1, "pear"), (3, "orange"), (2, "banana")]
by_name = sorted(produce, key=itemgetter(1))
print(by_name)
[(2, 'banana'), (3, 'orange'), (1, 'pear')]

선택한 필드가 우선 정렬 기준이 되고, 각 튜플은 온전한 형태로 유지됩니다. 여러 기준이 필요하다면 키 함수가 튜플을 반환하게 할 수도 있습니다. 예를 들어 (record[1].casefold(), record[0])은 대소문자를 구분하지 않는 이름을 먼저 비교하고 그다음 식별자를 비교합니다. 제자리에서 목록을 바꾸려면 sort()를 사용하고, 원래 순서를 유지해야 한다면 sorted()를 사용하세요.