сортировка списка без учета регистра, без нижнего регистра результата?
у меня есть список строк, как это:
['Aden', 'abel']
Я хочу сортировать элементы, без учета регистра. Поэтому я хочу получить:
['abel', 'Aden']
но я получаю противоположное с sorted()
или list.sort()
, потому что верхний регистр появляется перед Нижним.
как я могу игнорировать это дело? Я видел решения, которые включают в себя нижний регистр всех элементов списка, но я не хочу изменять случай элементов списка.
6 ответов:
следующие работы в Python 2:
sorted_list = sorted(unsorted_list, key=lambda s: s.lower())
он работает как для обычных, так и для unicode строк, так как они оба имеют
lower
метод.в Python 2 он работает для смеси обычных и unicode строк, так как значения двух типов можно сравнить друг с другом. Однако Python 3 не работает так: вы не можете сравнивать строку байта и строку Юникода, поэтому в Python 3 Вы должны делать разумную вещь и сортировать только списки одного типа строка.
>>> lst = ['Aden', u'abe1'] >>> sorted(lst) ['Aden', u'abe1'] >>> sorted(lst, key=lambda s: s.lower()) [u'abe1', 'Aden']
начиная с python 3.3, есть также
str.casefold
метод, который специально разработан для беспроблемного сопоставления и может быть использован вместоstr.lower
:sorted_list = sorted(unsorted_list, key=lambda s: s.casefold())
>>> x = ['Aden', 'abel'] >>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode ['abel', 'Aden']
В Python 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']
в 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)
попробуй такое
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']