반응형
질문
파이썬에서 알파벳순으로 정렬된 목록을 만드는 가장 좋은 방법은 무엇인가요?
답변
기본 답변:
mylist = ["b", "C", "A"]
mylist.sort()
이는 원래의 리스트를 수정합니다(즉, 제자리에서 정렬됩니다). 원본을 변경하지 않고 정렬된 리스트의 사본을 얻으려면 sorted()
함수를 사용하세요:
for x in sorted(mylist):
print x
그러나 위의 예제는 조금 나이브합니다. 로케일을 고려하지 않고 대소문자를 구분하여 정렬합니다. 요소마다 여러 번 평가되어야 하는 cmp
를 사용하는 대신, 선택적 매개변수 key
를 사용하여 사용자 정의 정렬 순서를 지정할 수 있습니다(헬퍼 함수인 cmp_to_key
는 functools에서 제공됩니다).
따라서 현재 로케일에 따라 언어별 규칙을 고려하여 정렬하려면 다음과 같이 사용할 수 있습니다(사용자 정의 로케일을 지정할 수도 있습니다):
sorted(mylist, key=cmp_to_key(locale.strcoll))
마지막으로, 필요한 경우 사용자 정의 로케일을 지정할 수 있습니다:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # 사용하는 언어/로케일에 따라 다름
assert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad']
마지막으로, lower()
메서드를 사용하는 대소문자를 구분하지 않는 정렬 예제를 볼 수 있습니다. 이는 ASCII 문자 집합에 대해서만 올바르게 작동하므로, 비영어 데이터에 대해서는 잘못된 방법입니다:
# 이것은 잘못된 방법입니다!
mylist.sort(key=lambda x: x.lower())
# 더 간단한 표기법, 약간 더 빠르지만 여전히 잘못된 방법
mylist.sort(key=str.lower)
반응형
댓글