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.
Aar*_*all 14
Python 3的新答案,我想补充两点:
str.casefold不区分大小写的比较.那是:
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.lower或str.upper?根据文件:
Casefolding类似于lowercasing但更具攻击性,因为它旨在删除字符串中的所有大小写区别.例如,德语小写字母
'ß'相当于"ss".因为它已经是小写的,所以str.lower()什么都不做'ß';casefold()将其转换为"ss".
我需要添加另一个答案,因为已接受的答案和较新的版本都缺少一件重要的事情:
这里提出的不区分大小写的排序在“相等”键的排序中并不稳定!
这意味着:当您想要对混合大小写字符串进行排序时,您会得到一个正确排序的列表,但未定义“AbC”是在“aBc”之前还是之后。这甚至可能在同一程序的运行之间有所不同。
为了始终具有相同的输出和稳定的默认字符串排序,我使用以下函数:
sorted(var, key=lambda v: (v.casefold(), v))
Run Code Online (Sandbox Code Playgroud)
这样,当折页版本不提供排序差异时,始终将原始键作为后备排序附加。