我有以下列表
l = ['SRATT', 'SRATW', 'CRAT', 'CRA0', 'SRBTT', 'SRBTW', 'SRAT0', 'SRBT0']
我希望按字母顺序排序,添加的规则是在末尾包含数字的字符串(实际上总是0)必须在最后一个完全按字母顺序排列的字符串之后(最后一个字母最多为W)。
我该怎么做? (如果可能的话,使用像sorted
)
对于此示例列表,所需的结果将是
['CRAT', 'CRA0', 'SRATT', 'SRATW' , 'SRAT0', 'SRBTT', 'SRBTW', 'SRBT0']
e.g。以下不起作用
sorted(l, key=lambda x: x[-1].isdigit())
因为它将包含最终数字的字符串放在最后,如此
['SRATT', 'SRATW', 'CRAT', 'SRBTT', 'SRBTW', 'CRA0', 'SRAT0', 'SRBT0']
答案 0 :(得分: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']
@StefanPochmann表示,这将以相同的开头和不同的最后一位非数字字符失败。
我们可以在键的末尾添加额外的元素,这将是元素本身
>>> 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']
@Demosthene注意到第二次尝试不起作用,这是真的
因此,工作解决方案是选择元素末尾的任何数字(如果存在)并更改为字母和数字范围之外的符号,例如'{'
:
sorted(l, key=lambda x: ''.join((x[:-1], '{')) if x[-1].isdigit() else x)
或
sorted(l, key=lambda x: x[:-1] + '{' if x[-1].isdigit() else x)
正如@StefanPochmann所说。哪个可能更快。
答案 1 :(得分:4)
你必须在字符串上保留字母标准(减去最后一个元素),并引入另一个标准:以数字结尾。
sorted(l, key=lambda x: (x[:-1] ,x[-1].isdigit()))
更复杂但更健壮的方式:
sorted(l, key=lambda x: (x[:-1] if len(x)>1 and not x[-1].isdigit() else x,x[-1].isdigit() if x else False))
(修复Stefan指出的角落案例,其中列表由1或0个大小的元素或['AB', 'AA']
个案例组成)
答案 2 :(得分:2)
这是另一种简单的方法,只需将0
视为Z
:
>>> sorted(l, key=lambda x: x.replace('0', 'Z'))
['CRAT', 'CRA0', 'SRATT', 'SRATW', 'SRAT0', 'SRBTT', 'SRBTW', 'SRBT0']
(我假设字符串前面没有零,请告诉我这是不是错了。)