我有一个字符串列表,像这样:

['Aden', 'abel']

我想对项目进行排序,不区分大小写。 我想要得到:

['abel', 'Aden']

但是我用sorted()或list.sort()得到相反的结果,因为大写字母出现在小写字母之前。

我怎么能无视这个案子呢?我看到的解决方案包括小写所有列表项,但我不想改变列表项的大小写。


当前回答

我在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)

其他回答

这在python3中有效,并且不涉及将结果小写(!)。

values.sort(key=str.lower)

我在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)

Python3:

排序在其他答案中讨论过,但下面是排序选项的幕后操作。

假设我们想对以下列表进行不区分大小写的排序,我们可以使用'key=':

strs = ['aa', 'BB', 'zz', 'CC']
strs_sorted = sorted(strs,key=str.lower)
print(strs_sorted)
 ['aa', 'BB', 'CC', 'zz']

这里发生了什么?

键告诉排序使用代理值。'Key='在比较之前转换每个元素。key函数接收1个值并返回1个值,返回的“代理”值用于排序中的比较。

因此,我们正在招聘。Lower '使我们所有的代理值都小写,这消除了大小写差异,并按小写顺序返回列表。

Str.lower vs str.casefold

正如在其他文章中提到的,你也可以使用“casefold()”作为键或任何东西(例如“len”按字符长度排序)。casefold()方法是一个主动的lower()方法,它将字符串转换为大小写折叠字符串以进行无大小写匹配。

sorted(strs,key=str.casefold)

那创建我自己的排序函数呢?

一般来说,最好使用内置函数进行排序,除非非常需要不这样做。内置功能已经过单元测试,很可能是最可靠的。

Python2:

类似的原则,

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)

输出

(“亚伯”,“亚丁湾”)

你也可以这样对列表进行排序:

>>> x = ['Aden', 'abel']
>>> x.sort(key=lambda y: y.lower())
>>> x
['abel', 'Aden']