결과를 소문자로 구분하지 않고 대소 문자를 구분하지 않는 목록 정렬?


133

다음과 같은 문자열 목록이 있습니다.

['Aden', 'abel']

대소 문자를 구분하지 않고 항목을 정렬하고 싶습니다. 그래서 나는 얻고 싶다 :

['abel', 'Aden']

그러나 대문자가 소문자 앞에 나타나기 때문에 sorted()or 와 반대입니다 list.sort().

사건을 어떻게 무시할 수 있습니까? 모든 목록 항목을 소문자로 묶는 솔루션을 보았지만 목록 항목의 대소 문자를 변경하고 싶지 않습니다.


이 튜토리얼은 매우 유용합니다 : docs.python.org/3/howto/sorting.html#sortinghowto
ady

답변:


192

Python 3.3 이상에는 대소 문자를 구분하지 않도록 str.casefold특별히 설계된 메소드가 있습니다.

sorted_list = sorted(unsorted_list, key=str.casefold)

Python 2에서는 lower()다음을 사용하십시오 .

sorted_list = sorted(unsorted_list, key=lambda s: s.lower())

둘 다 lower메소드를 가지고 있기 때문에 일반 및 유니 코드 문자열 모두에서 작동합니다 .

Python 2에서는 두 유형의 값을 서로 비교할 수 있기 때문에 일반 및 유니 코드 문자열의 혼합에서 작동합니다. 파이썬 3은 그렇게 작동하지 않습니다 : 바이트 문자열과 유니 코드 문자열을 비교할 수 없으므로 파이썬 3에서는 제정신을하고 한 유형의 문자열 목록 만 정렬해야합니다.

>>> lst = ['Aden', u'abe1']
>>> sorted(lst)
['Aden', u'abe1']
>>> sorted(lst, key=lambda s: s.lower())
[u'abe1', 'Aden']

11
일반 함수를 사용 하거나 (Python 2)모듈방법을 사용하여 (Python 3)으로 람다 함수 왕복을 피할 수 있습니다 . 하나는 또한 사용할 수 있습니다 파이썬 2에서 문자열을,하지만 사용하는 것 에 대한 객체 반면, (당신이 그것을 넣어,하지만, 정말 아마도 작업의 "제정신"모드하지 않은)를 모두 받아들입니다. str.lowersorted(lst, key=str.lower)lowerstringsorted(lst, key=string.lower)str.lowerunicode.lowerunicodestring.lower
Daniel Andersson 2016 년

[ 'a', 'A', 'B', 'b'로 정렬되는 [ 'Z', 'B', 'a', 'b', 'A']와 같은 목록에서는 작동하지 않습니다. '지']. 파이썬의 sort () 및 sorted ()는 문자열이 일치 할 때 원래 순서를 유지하므로 대문자 'B'는 소문자 'b'앞에 나타납니다. 이 경우 대문자 'B'는 대소 문자를 사용할 때 소문자 'b'와 일치하는 것으로 간주됩니다. sorted (spam, key = str.lower) 또는 sorted (spam, key = str.upper) 또는 sorted (spam, key = str.casefold)와 비교하기 위해 대소 문자를 변환하는 경우 항상 발생합니다.
PJ Singh

대신이 솔루션을 사용해보십시오 : stackoverflow.com/a/1098160/10668287 . [ 'Aden', 'aden']을 [ 'aden', 'Aden']으로 올바르게 정렬합니다.
PJ Singh

46
>>> x = ['Aden', 'abel']
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode
['abel', 'Aden']

파이썬 3에서는 str유니 코드는하지만, 파이썬 2에서 당신은 모두 작동이 더 일반적인 접근 사용할 수 있습니다 strunicode:

>>> sorted(x, key=lambda s: s.lower())
['abel', 'Aden']

감사합니다. 나는 이것을 전에 언급해야한다는 것을 알고 있지만 유니 코드 문자열 (Py2) 에서이 방법을 사용하는 데 문제가 있다고 들었습니다. 그것에 대해 아는 것이 있습니까?

그들은 모두 유니 코드입니다. 감사! 또 다른 질문은 다음과 같은 목록에서 수행하는 방법입니다.[['Aden'], ['abel']]

각 목록에는 하나의 항목 만 있습니까? 그렇다면 다음과 같이 약간 수정하십시오.sorted(x,key=lambda i:i[0].lower())
jamylak

글쎄, 그것은 다른 것들도있을 수 있지만 정렬에 사용해서는 안됩니다.

1
신경 쓰지 마라. 정확하지 않다. 문자열과 유니 코드의 혼합에 대해 정렬이 작동한다. 튜플도 정렬에 포함 된 이전 질문과 혼동되었다.
jamylak

10

다음과 같이 목록을 적절하게 정렬 할 수도 있습니다.

>>> x = ['Aden', 'abel']
>>> x.sort(key=lambda y: y.lower())
>>> x
['abel', 'Aden']


3

python3에서 사용할 수 있습니다

list1.sort(key=lambda x: x.lower()) #Case In-sensitive             
list1.sort() #Case Sensitive

1

파이썬 3.3에서 이런 식으로했습니다 :

 def sortCaseIns(lst):
    lst2 = [[x for x in range(0, 2)] for y in range(0, len(lst))]
    for i in range(0, len(lst)):
        lst2[i][0] = lst[i].lower()
        lst2[i][1] = lst[i]
    lst2.sort()
    for i in range(0, len(lst)):
        lst[i] = lst2[i][1]

그런 다음이 함수를 호출 할 수 있습니다.

sortCaseIns(yourListToSort)

0

파이썬 2 OR 3 (파이썬 2.7.17 및 파이썬 3.6.9에서 테스트)에서 문자열 을 제자리에 정렬하는 대소 문자 구분없는 정렬 :

>>> x = ["aa", "A", "bb", "B", "cc", "C"]
>>> x.sort()
>>> x
['A', 'B', 'C', 'aa', 'bb', 'cc']
>>> x.sort(key=str.lower)           # <===== there it is!
>>> x
['A', 'aa', 'B', 'bb', 'C', 'cc']

열쇠는 key=str.lower입니다. 쉽게 복사하여 붙여 넣을 수 있도록 명령만으로 명령을 표시하는 방법은 다음과 같습니다.

x = ["aa", "A", "bb", "B", "cc", "C"]
x.sort()
x
x.sort(key=str.lower)
x

그러나 문자열이 (과 같은 u'some string') 유니 코드 문자열 인 경우 Python 2에서만 (이 경우 Python 3에서는 아님) 위 x.sort(key=str.lower)명령이 실패하고 다음 오류가 출력됩니다.

TypeError: descriptor 'lower' requires a 'str' object but received a 'unicode'

이 오류가 발생하면 유니 코드 정렬을 처리하는 Python 3으로 업그레이드하거나 목록 이해를 사용하여 유니 코드 문자열을 먼저 ASCII 문자열로 변환하십시오.

# for Python2, ensure all elements are ASCII (NOT unicode) strings first
x = [str(element) for element in x]  
# for Python2, this sort will only work on ASCII (NOT unicode) strings
x.sort(key=str.lower)

참고 문헌 :

  1. https://docs.python.org/3/library/stdtypes.html#list.sort
  2. 유니 코드 문자열을 파이썬의 문자열로 변환 (추가 기호 포함)
  3. https://www.programiz.com/python-programming/list-comprehension

-3

이 시도

def cSort(inlist, minisort=True):
    sortlist = []
    newlist = []
    sortdict = {}
    for entry in inlist:
        try:
            lentry = entry.lower()
        except AttributeError:
            sortlist.append(lentry)
        else:
            try:
                sortdict[lentry].append(entry)
            except KeyError:
                sortdict[lentry] = [entry]
                sortlist.append(lentry)

    sortlist.sort()
    for entry in sortlist:
        try:
            thislist = sortdict[entry]
            if minisort: thislist.sort()
            newlist = newlist + thislist
        except KeyError:
            newlist.append(entry)
    return newlist

lst = ['Aden', 'abel']
print cSort(lst)

산출

['abel', 'Aden']


9
이 솔루션은 하나의 라이너로 충분하면 과잉이며 읽을 수 없습니다. 이것은 파이썬 이외의 언어에서는 더 수용 가능할 수 있습니다.
IceArdor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.