Сортировка по регистро-регистровому регистру без уменьшения результата?
У меня есть список таких строк:
['Aden', 'abel']
Я хочу сортировать элементы, не зависящие от регистра.
Поэтому я хочу получить:
['abel', 'Aden']
Но я получаю противоположное значение с sorted()
или list.sort()
, потому что в верхнем регистре отображается нижний регистр.
Как я могу игнорировать дело? Я видел решения, которые включают в себя уменьшение всех элементов списка, но я не хочу изменять регистр элементов списка.
Ответы
Ответ 1
В 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 это работает для смеси обычных и юникодных строк, поскольку значения двух типов можно сравнивать друг с другом. Однако Python 3 работает не так: вы не можете сравнивать байтовую строку и строку в юникоде, поэтому в Python 3 вы должны выполнять разумные действия и сортировать списки только одного типа строки.
>>> lst = ['Aden', u'abe1']
>>> sorted(lst)
['Aden', u'abe1']
>>> sorted(lst, key=lambda s: s.lower())
[u'abe1', 'Aden']
Ответ 2
>>> x = ['Aden', 'abel']
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode
['abel', 'Aden']
В Python 3 str
является unicode, но в Python 2 вы можете использовать этот более общий подход, который работает как для str
, так и unicode
:
>>> sorted(x, key=lambda s: s.lower())
['abel', 'Aden']
Ответ 3
Вы также можете попробовать следующее:
>>> x = ['Aden', 'abel']
>>> x.sort(key=lambda y: y.lower())
>>> x
['abel', 'Aden']
Ответ 4
В python3 вы можете использовать
list1.sort(key=lambda x: x.lower()) #Case In-sensitive
list1.sort() #Case Sensitive
Ответ 5
Это работает в Python 3 и не включает в себя нижний регистр результата (!).
values.sort(key=str.lower)
Ответ 6
Я сделал это для 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)
Ответ 7
Попробуйте это
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']