다음과 같은 문자열 목록이 있습니다.
['Aden', 'abel']
대소 문자를 구분하지 않고 항목을 정렬하고 싶습니다. 그래서 나는 얻고 싶다 :
['abel', 'Aden']
그러나 대문자가 소문자 앞에 나타나기 때문에 sorted()
or 와 반대입니다 list.sort()
.
사건을 어떻게 무시할 수 있습니까? 모든 목록 항목을 소문자로 묶는 솔루션을 보았지만 목록 항목의 대소 문자를 변경하고 싶지 않습니다.
다음과 같은 문자열 목록이 있습니다.
['Aden', 'abel']
대소 문자를 구분하지 않고 항목을 정렬하고 싶습니다. 그래서 나는 얻고 싶다 :
['abel', 'Aden']
그러나 대문자가 소문자 앞에 나타나기 때문에 sorted()
or 와 반대입니다 list.sort()
.
사건을 어떻게 무시할 수 있습니까? 모든 목록 항목을 소문자로 묶는 솔루션을 보았지만 목록 항목의 대소 문자를 변경하고 싶지 않습니다.
답변:
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']
str.lower
sorted(lst, key=str.lower)
lower
string
sorted(lst, key=string.lower)
str.lower
unicode.lower
unicode
string.lower
>>> x = ['Aden', 'abel']
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode
['abel', 'Aden']
파이썬 3에서는 str
유니 코드는하지만, 파이썬 2에서 당신은 모두 작동이 더 일반적인 접근 사용할 수 있습니다 str
및 unicode
:
>>> sorted(x, key=lambda s: s.lower())
['abel', 'Aden']
sorted(x,key=lambda i:i[0].lower())
다음과 같이 목록을 적절하게 정렬 할 수도 있습니다.
>>> x = ['Aden', 'abel']
>>> x.sort(key=lambda y: y.lower())
>>> x
['abel', 'Aden']
이것은 Python 3에서 작동하며 결과를 소문자로 묶지 않습니다 (!).
values.sort(key=str.lower)
파이썬 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)
파이썬 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)
이 시도
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']