我有一个列表,其中包含代表动物名称的字符串。我需要对列表进行排序。如果我使用sorted(list)
,它将首先以大写字符串给出列表输出,然后是小写。
但我需要以下输出。
输入:
var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
输出:
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
我有一个列表,其中包含代表动物名称的字符串。我需要对列表进行排序。如果我使用sorted(list)
,它将首先以大写字符串给出列表输出,然后是小写。
但我需要以下输出。
输入:
var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
输出:
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
sort()
方法和函数sorted()
接受一个关键参数:
var.sort(key=lambda v: v.upper())
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']
要排序Ant
before ant
,您必须在键中包含更多信息,以便其他相等的值按给定顺序排序:
>>> sorted(var, key=lambda v: (v.upper(), v[0].islower()))
['Ant', 'ant', 'Bat', 'bat', 'Cat', 'cat', 'Goat', 'Lion']
更复杂的密钥生成('ANT', False)
forAnt
和('ANT', True)
for ant
; True
排在后面False
,因此大写的单词排在其等效的小写字母之前。
有关更多信息,请参阅Python 排序 HOWTO。
Python 3 的新答案,我想补充两点:
str.casefold
不区分大小写的比较。那是:
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.lower
or不同str.upper
?根据文档:
大小写折叠类似于小写,但更具侵略性,因为它旨在删除字符串中的所有大小写区别。例如,德语小写字母
'ß'
等价于"ss"
. 由于它已经是小写字母,str.lower()
因此不会对'ß'
;casefold()
将其转换为"ss"
.
我需要添加另一个答案,因为接受的答案和较新的版本都缺少一个重要的东西:
这里提出的不区分大小写的排序在“相等”键的排序中是不稳定的!
这意味着:当您想要排序混合大小写字符串时,您会得到一个正确排序的列表,但不确定“AbC”是在“aBc”之前还是之后。这甚至可能在同一程序的运行之间有所不同。
为了始终使用稳定的默认字符串顺序获得相同的输出,我使用以下函数:
sorted(var, key=lambda v: (v.casefold(), v))
这样,当 casefold 版本不提供要排序的差异时,原始键始终作为后备排序附加。