我有一个列表,其中包含表示动物名称的字符串。 我需要对列表进行排序。 如果我使用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
的函数,并使用返回值进行排序,而不影响实际值:
>>> 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
;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
或者 str.upper
不同?根据文档:
Casefolding 类似于 lowercasing,但更加强制,因为它旨在删除字符串中所有的大小写区别。例如,德语小写字母
'ß'
等价于"ss"
。由于它已经是小写,str.lower()
不会对'ß'
做任何改变,而casefold()
则将其转换为"ss"
。
我需要再添加另一个答案,因为接受的答案和更新版本缺少一个重要的东西:
这里提出的不区分大小写的排序在“相等”键的排序中不是稳定的!
这意味着: 当你有一堆混合大小写字符串要排序时,你会得到一个正确排序的列表,但是无法确定"AbC"在"aBc"之前还是之后。这甚至可能因为同一个程序的运行而有所不同。
为了始终使用稳定的默认字符串排序方式获得相同的输出,我使用以下函数:
sorted(var, key=lambda v: (v.casefold(), v))
当大小写版本没有提供排序依据时,原始密钥始终作为回退排序附加在后面。
Ant
在ant
之前排序。例如使用lambda v: (v.upper(), v[0].islower())
,因为True
在False
之后排序。 - Martijn Pieterssorted(var, key=lambda v: (v.upper(), v))
。 - coldfixset
等上进行排序)。这既不符合key=str.upper
也不符合您的最后一个建议。 - coldfixsorted(var, key=lambda v: (v.upper(), v.swapcase()))
可能会很有效。 - Casey Kuball