programing

대/소문자를 구분하지 않는 목록 정렬, 낮은 대/소문자 구분 없이?

instargram 2023. 5. 7. 10:57
반응형

대/소문자를 구분하지 않는 목록 정렬, 낮은 대/소문자 구분 없이?

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

['Aden', 'abel']

대소문자를 구분하지 않고 항목을 분류하고 싶습니다.그래서 저는 다음을 원합니다.

['abel', 'Aden']

하지만 저는 반대입니다sorted()또는list.sort()대문자는 소문자 앞에 나타나기 때문입니다.

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

Python 3.3+에는 대소문자를 구분하지 않고 일치하도록 특별히 설계된 방법이 있습니다.

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

Python 2에서 사용lower():

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

일반 문자열과 유니코드 문자열 모두에 대해 작동합니다. 둘 다 다음과 같은 기능을 가지고 있기 때문입니다.lower방법.

Python 2에서는 두 유형의 값을 서로 비교할 수 있기 때문에 일반 문자열과 유니코드 문자열을 혼합하여 사용할 수 있습니다.그러나 Python 3은 그렇게 작동하지 않습니다. 바이트 문자열과 유니코드 문자열을 비교할 수 없으므로 Python 3에서는 올바른 작업을 수행하고 한 유형의 문자열 목록만 정렬해야 합니다.

>>> lst = ['Aden', u'abe1']
>>> sorted(lst)
['Aden', u'abe1']
>>> sorted(lst, key=lambda s: s.lower())
[u'abe1', 'Aden']
>>> x = ['Aden', 'abel']
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode
['abel', 'Aden']

파이썬 3에서str유니코드이지만 Python 2에서는 두 가지 모두에 효과가 있는 보다 일반적인 접근 방식을 사용할 수 있습니다.str그리고.unicode:

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

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

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

이것은 Python 3에서 작동하며 소문자 결과(!)를 포함하지 않습니다.

values.sort(key=str.lower)

python3에서 당신은 사용할 수 있습니다.

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

Python 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)

대소문자를 구분하지 않는 정렬, Python 2 또는 3에서 문자열을 정렬(Python 2.7.17 및 Python 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:

정렬은 다른 답변에서 논의되지만 정렬 옵션을 사용한 백그라운드에서 수행되는 작업은 다음과 같습니다.

대소문자를 구분하지 않고 'key='를 사용하여 다음 목록을 정렬하고 싶다고 가정합니다.

strs = ['aa', 'BB', 'zz', 'CC']
strs_sorted = sorted(strs,key=str.lower)
print(strs_sorted)
 ['aa', 'BB', 'CC', 'zz']

여기서 무슨 일이 일어나고 있습니까?

핵심은 정렬에 '프록시 값'을 사용하도록 지시하는 것입니다.'Key='는 비교 전에 각 요소를 변환합니다.키 함수는 1개의 값을 사용하고 1개의 값을 반환하며 반환된 "프록시" 값은 정렬 내 비교에 사용됩니다.

프록시 정렬 예제

따라서 '.lower'를 사용하여 모든 프록시 값을 소문자로 만들어 대소문자 차이를 없애고 기본적으로 소문자 순으로 목록을 반환합니다.

str.lower 대 str.casefold

다른 게시물에서 언급했듯이 "casefold()"를 키 또는 기타로 사용할 수도 있습니다(예: 문자 길이로 정렬하려면 "len").casefold() 메서드는 문자열을 대소문자가 없는 일치를 위해 대소문자가 접힌 문자열로 변환하는 공격적인 하위() 메서드입니다.

sorted(strs,key=str.casefold)

나만의 정렬 기능을 만드는 것은 어떻습니까?

일반적으로 정렬할 때는 특별히 필요하지 않은 경우를 제외하고는 항상 기본 제공 기능을 사용하는 것이 좋습니다.내장 기능은 유닛 테스트를 거쳤으며 가장 신뢰할 수 있을 것입니다.

파이썬2:

비슷한 원리,

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

사용해 보세요.

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']

언급URL : https://stackoverflow.com/questions/10269701/case-insensitive-list-sorting-without-lowercasing-the-result

반응형