문자열 목록을 정렬하는 방법?


417

파이썬에서 알파벳순으로 정렬 된 목록을 만드는 가장 좋은 방법은 무엇입니까?


1
locale현재 로케일에 따라 자연스럽게 정렬하는 문자열 조합 방법을 사용하십시오 .
u0b34a0f6ae

답변:


519

기본 답변 :

mylist = ["b", "C", "A"]
mylist.sort()

그러면 원래 목록이 수정됩니다 (즉, 내부 정렬). 원본을 변경하지 않고 정렬 된 목록의 사본을 얻으려면 다음 sorted()함수를 사용하십시오 .

for x in sorted(mylist):
    print x

그러나 위의 예제는 로케일을 고려하지 않고 대소 문자 구분 정렬을 수행하기 때문에 순진합니다. 선택적 매개 변수 key를 사용하여 사용자 정의 정렬 순서를 지정할 수 있습니다 (를 사용하는 대안 cmp은 여러 번 평가되어야하므로 사용되지 않는 솔루션 key입니다. 요소 당 한 번만 계산 됨).

따라서 언어 별 규칙을 고려하여 현재 로캘에 따라 정렬하려면 cmp_to_keyfunctools의 도우미 기능입니다.

sorted(mylist, key=cmp_to_key(locale.strcoll))

마지막으로 필요한 경우 정렬을위한 사용자 지정 로캘 을 지정할 수 있습니다 .

import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'),
  key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad']

마지막 참고 :이 lower()방법 을 사용하는 대소 문자를 구분하지 않는 정렬의 예를 볼 수 있습니다 -ASCII 하위 문자에만 작동하기 때문에 잘못되었습니다. 영어가 아닌 데이터에는이 두 가지가 잘못되었습니다.

# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)

37
mylist.sort(key=str.lower)가 더 빠르다.
jfs

1
좋은 지적. 초보자가 현재 상황을 파악하는 것이 더 쉽기 때문에 현재 예제를 그대로 두겠습니다. 그러나 앞으로도이를 염두에 두겠습니다.
Eli

1
궁금한 사람이 있다면 list.sort ()의 성능을 확인할 수 있습니다 .
Hari Ganesan

1
@BornToCode : 1- 알아요 . 내 의견에 대한 답변 (2008 년)을보십시오 (내 의견은 람다의 불필요한 사용에 관한 것입니다). 비 ASCII 문자 정렬은 크게 다른 주제입니다. 로케일 기반 솔루션 대신 PyICU를 사용할 수 있습니다 .
jfs

1
@Dmitry 이것은에서 호출 된 정렬 함수의 반환 값을 인쇄하기 때문입니다 [1, 2, 3].sort(). 으로 sort()각종 장소의 목록 (즉, 직접 목록을 변경)은 정렬 된 목록을 반환하고, 실제로 아무것도 반환하지 않으며, 인쇄 문 인쇄 그렇게하지 않습니다 None. 당신이 변수에 목록을 저장 한 경우, 말 x,라고 x.sort(), 다음 print(x), 당신은 정렬 된 목록을 볼 것입니다.
bjg222

56

또한 sorted()기능에 주목할 가치가 있습니다.

for x in sorted(list):
    print x

원래 목록을 변경하지 않고 정렬 된 새 버전의 목록을 반환합니다.



18

문자열을 정렬하는 올바른 방법은 다음과 같습니다.

import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad']

# Without using locale.strcoll you get:
assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad']

의 이전 예제는 mylist.sort(key=lambda x: x.lower())ASCII 전용 컨텍스트에 적합합니다.


13

Python3에서 sorted () 함수를 사용하십시오

items = ["love", "like", "play", "cool", "my"]
sorted(items2)

10

그러나 이것은 언어 별 정렬 규칙을 어떻게 처리합니까? 로케일을 고려합니까?

아니요, list.sort()일반적인 정렬 기능입니다. 유니 코드 규칙에 따라 정렬하려면 사용자 정의 정렬 키 기능을 정의해야합니다. pyuca 모듈을 사용해 볼 수는 있지만 얼마나 완전한지 모르겠습니다.


1

오래된 질문이지만 설정하지 않고 로케일 인식 정렬을 locale.LC_ALL 수행하려면 이 답변에서 제안한대로 PyICU 라이브러리 를 사용하면 됩니다 .

import icu # PyICU

def sorted_strings(strings, locale=None):
    if locale is None:
       return sorted(strings)
    collator = icu.Collator.createInstance(icu.Locale(locale))
    return sorted(strings, key=collator.getSortKey)

그런 다음 예를 들어 전화하십시오.

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

이것은 로케일을 설치하거나 다른 시스템 설정을 변경하지 않고 나를 위해 일했습니다.

(이것은 이미 위의 의견에서 제안 되었지만 처음에는 직접 놓 쳤기 때문에 더 눈에 띄기를 원했습니다.)


0

가정 s = "ZWzaAd"

위의 문자열을 정렬하려면 간단한 솔루션이 1 아래입니다.

print ''.join(sorted(s))

그것은 당신이 여기에서 정렬하고있는 문자열의리스트가 아닙니다
mnl

0

아니면 :

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))

0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

결과

[ 'abc', 'ba', 'cd', 'dc', 'xy']


0

간단합니다 : https://trinket.io/library/trinkets/5db81676e4

scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'

점수 = scores.split ( ',') x 정렬 된 (점수) : print (x)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.