排序字符串列表忽略大写/小写

时间:2012-12-19 14:47:35

标签: python sorting lexicographic lexicographic-ordering

我有一个列表,其中包含代表动物名称的字符串。我需要对列表进行排序。如果我使用sorted(list),它将首先使用大写字符串给出列表输出,然后是小写。

但我需要以下输出。

输入:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

输出:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

4 个答案:

答案 0 :(得分:35)

sort()方法和sorted()函数采用关键参数:

var.sort(key=lambda v: v.upper())

为每个值调用key中命名的函数,并在排序时使用返回值,而不影响实际值:

>>> var=['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=lambda v: v.upper())
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

要在Ant之前对ant进行排序,您必须在密钥中包含更多信息,以便其他相等的值按给定顺序排序:

>>> sorted(var, key=lambda v: (v.upper(), v[0].islower()))
['Ant', 'ant', 'Bat', 'bat', 'Cat', 'cat', 'Goat', 'Lion']

更复杂的密钥为('ANT', False)生成Ant,为('ANT', True)生成ant; TrueFalse之后排序,因此大写单词在其小写等值之前排序。

有关详细信息,请参阅Python sorting HOWTO

答案 1 :(得分:8)

Python 3的新答案,我想补充两点:

  1. 使用str.casefold进行不区分大小写的比较。
  2. 直接使用该方法而不是lambda内部。
  3. 那是:

    var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
    
    var.sort(key=str.casefold)
    

    (就地排序)现在:

    >>> var
    ['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
    

    或者,要返回新列表,请使用sorted

    >>> var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
    >>> sorted(var, key=str.casefold)
    ['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
    

    为什么这与str.lowerstr.upper不同? According to the documentation:

      

    Casefolding类似于lowercasing但更具攻击性,因为它旨在删除字符串中的所有大小写区别。例如,德语小写字母'ß'相当于"ss"。由于它已经是小写的,str.lower()'ß'无效; casefold()将其转换为"ss"

答案 2 :(得分:1)

我们可以根据Python Sorting HOW TO文档使用“ sorted”功能。

a = sorted(Input, key=str.lower)print("Output1: ",a)

输出1:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

答案 3 :(得分:1)

我需要添加另一个答案,因为已接受的答案和更新的答案 版本缺少一件重要的事情

此处建议的不区分大小写的排序在的排序中不稳定 “相等”键!

这意味着:当您要混合使用大小写混合的字符串时, 您会得到正确排序的列表,但是尚不确定“ AbC”是否在 “ aBc”或之后。在同一程序的运行之间甚至可能有所不同。

为了始终以稳定的默认字符串顺序获得相同的输出, 我使用以下功能:

sorted(var, key=lambda v: (v.casefold(), v))

通过这种方式,当 casefold版本没有区别。