如何对字母数字列表进行自定义排序?

2024-09-30 18:15:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下清单

l = ['SRATT', 'SRATW', 'CRAT', 'CRA0', 'SRBTT', 'SRBTW', 'SRAT0', 'SRBT0']

我想按字母顺序排序,添加了一个规则,即末尾包含数字的字符串(实际上总是0)必须在最后一个完全按字母顺序排列的字符串之后(最后一个字母最多为W)。在

我怎么能做到呢?(如果可能,使用一个简单的方法,如sorted


对于这个示例列表,期望的结果是

^{pr2}$

下面这些不起作用

sorted(l, key=lambda x: x[-1].isdigit())

因为它把包含最后一个数字的字符串放在末尾,就像这样

['SRATT', 'SRATW', 'CRAT', 'SRBTT', 'SRBTW', 'CRA0', 'SRAT0', 'SRBT0']

Tags: 字符串排序顺序字母数字sorted末尾srbtt
3条回答

还有一个简单的方法,只需将0视为Z

>>> sorted(l, key=lambda x: x.replace('0', 'Z'))
['CRAT', 'CRA0', 'SRATT', 'SRATW', 'SRAT0', 'SRBTT', 'SRBTW', 'SRBT0']

(我假设字符串前面没有零,如果是错的,请告诉我。)

底部工作液!在

第一次尝试:

>>> l = ['SRATT', 'SRATW', 'CRAT', 'CRA0', 'SRBTT', 'SRBTW', 'SRAT0', 'SRBT0']
>>> sorted(l, key=lambda x: (x[:-1], x[-1].isdigit()))
['CRAT', 'CRA0', 'SRATT', 'SRATW', 'SRAT0', 'SRBTT', 'SRBTW', 'SRBT0']

更新

@StefanPochmann说,如果开头相同,最后一个非数字字符不同,这将失败。在

我们可以在key的末尾添加额外的元素,即元素本身

^{pr2}$

更新(最后,希望如此)

@Demosthene注意到第二次尝试没有成功,这是真的

因此,有效的解决方案是在元素的末尾(如果存在的话)选择任何一个数字,并将其更改为超出字母和数字范围的符号,例如'{'

^{3}$

或者

sorted(l, key=lambda x: x[:-1] + '{' if x[-1].isdigit() else x)

正如@StefanPochmann所说。可能更快。在

您必须保留字符串的字母标准(减去最后一个元素),并引入另一个条件:以数字结尾。在

sorted(l, key=lambda x: (x[:-1] ,x[-1].isdigit()))

一种更复杂但更强大的方法:

^{pr2}$

(修复了Stefan指出的由1个或0个大小的元素组成的角落大小写,或者['AB', 'AA']大小写)

相关问题 更多 >