如何自定义字母数字列表?

Dem*_*ene 6 python sorting string list alphanumeric

我有以下清单

l = ['SRATT', 'SRATW', 'CRAT', 'CRA0', 'SRBTT', 'SRBTW', 'SRAT0', 'SRBT0']
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?(如果可能的话,使用简单的方法sorted)


对于此示例列表,将获得所需的结果

['CRAT', 'CRA0', 'SRATT', 'SRATW' , 'SRAT0', 'SRBTT', 'SRBTW', 'SRBT0']
Run Code Online (Sandbox Code Playgroud)

例如以下不起作用

sorted(l, key=lambda x: x[-1].isdigit())
Run Code Online (Sandbox Code Playgroud)

因为它将包含最终数字的字符串放在最后,就像这样

['SRATT', 'SRATW', 'CRAT', 'SRBTT', 'SRBTW', 'CRA0', 'SRAT0', 'SRBT0']
Run Code Online (Sandbox Code Playgroud)

vis*_*ell 6

工作解决方案在底部!

第一次尝试:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

UPDATE

@StefanPochmann表示,这将失败,具有相同的开头和不同的最后一位非数字字符.

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

>>> l = ['SRATT', 'SRATW', 'CRAT', 'CRA0', 'SRBTT', 'SRBTW', 'SRAT0', 'SRBT0', 'B', 'A']
>>> sorted(l, key=lambda x: (x[:-1], x[-1].isdigit(), x))
                                                      ^
                                             additional element
['A', 'B', 'CRAT', 'CRA0', 'SRATT', 'SRATW', 'SRAT0', 'SRBTT', 'SRBTW', 'SRBT0']
Run Code Online (Sandbox Code Playgroud)

更新(最后,我希望如此)

@Demosthene指出,第二次尝试不起作用,这是真的

因此,工作解决方案是选择元素末尾的任何数字(如果存在)并更改为字母和数字范围之外的符号,例如'{':

sorted(l, key=lambda x: ''.join((x[:-1], '{')) if x[-1].isdigit() else x)
Run Code Online (Sandbox Code Playgroud)

要么

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

正如@StefanPochmann指出的那样.哪个可能更快.