Сортировка по регистро-регистровому регистру без уменьшения результата?

У меня есть список таких строк:

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