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

Dar*_*ght 22 python sorting lexicographic lexicographic-ordering

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

但我需要以下输出.

输入:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
Run Code Online (Sandbox Code Playgroud)

输出:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 40

sort()方法和sorted()功能迈出了关键的参数:

var.sort(key=lambda v: v.upper())
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

更复杂的键产生('ANT', False)Ant,和('ANT', True)用于ant; True在之后排序False,因此大写单词在它们的小写等价之前排序.

有关更多信息,请参阅Python排序HOWTO.

  • 更好地使用“sorted(var, key=lambda v: (v.upper(), v))” (2认同)
  • OFC,但我认为有点想要对整个单词不区分大小写,并使用第一个字母的情况进行边缘情况,然后突然停在那里并使用其余的稳定性:)如果有人是写*代码*我99%肯定他们实际上想从上面的评论中得到更简单的解决方案,这使得输出元素集的输出确定性的顺序与其初始顺序无关(所以你可以使用)这可以对`set`s etc'进行排序.这可以通过`key = str.upper`来完成,也可以通过你的上一个建议实现. (2认同)

Aar*_*all 14

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

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

那是:

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

var.sort(key=str.casefold)
Run Code Online (Sandbox Code Playgroud)

(现场排序)现在:

>>> var
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
Run Code Online (Sandbox Code Playgroud)

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

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

这是为什么不同str.lowerstr.upper根据文件:

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


Chr*_*mer 6

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

这里提出的不区分大小写的排序在“相等”键的排序中并不稳定!

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

为了始终具有相同的输出和稳定的默认字符串排序,我使用以下函数:

sorted(var, key=lambda v: (v.casefold(), v))
Run Code Online (Sandbox Code Playgroud)

这样,当折页版本不提供排序差异时,始终将原始键作为后备排序附加。