대/소문자를 구분하지 않는 목록 정렬, 낮은 대/소문자 구분 없이?
다음과 같은 문자열 목록이 있습니다.
['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)
참조:
- https://docs.python.org/3/library/stdtypes.html#list.sort
- 유니코드 문자열을 파이썬에서 문자열로 변환(추가 기호 포함)
- 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
'programing' 카테고리의 다른 글
구성요소로 각진 2개의 테이블 행 (0) | 2023.05.07 |
---|---|
호출 스레드는 STA여야 합니다. 많은 UI 구성 요소에서 이 작업이 필요하기 때문입니다. (0) | 2023.05.07 |
데이터베이스가 생성된 이후 컨텍스트를 지원하는 모델이 변경되었습니다. (0) | 2023.05.07 |
C# 6.0은 에 적용됩니까?NET 4.0? (0) | 2023.05.07 |
피쳐 분기를 다른 피쳐 분기로 기본 재배치 (0) | 2023.05.07 |