排序列表但将星号从第一个更改为最后一个

Sort list but change the asterisk from being first to last

排序列表时,我认为 Python 将 '*' 视为“之前”(Python 用于排序的顺序是什么?)字母和数字,我希望它是另一种方式。我希望 'A*0''A0', 'AB', 'A1', ... 之后,而不是在他们之前。如何实现这一目标?

这是一个最小的可重现示例:

list = ["A*0", "A0", "A1", "A*1", "AB", "*BC", "C"]
sorted(list)
Out[7]: ['*BC', 'A*0', 'A*1', 'A0', 'A1', 'AB', 'C']

我想要这种行为:

list = ["A*0", "A0", "A1", "A*1", "AB", "*BC", "C"]
sorted(list)
Out[7]: ['A0', 'A1', 'AB', 'A*0', 'A*1', "C", "*BC"]

传递一个排序键,将 * 替换为 ~

lst = ["A*0", "A0", "A1", "A*1", "AB"]
# replace * by ~ when sorting (since ~ has the highest ascii value)
sorted(lst, key=lambda x: x.replace('*','~'))
# ['A0', 'A1', 'AB', 'A*0', 'A*1']

使用key对已有的排序结果重新排序:

>>> lst = ["A*0", "A0", "A1", "A*1", "AB"]
>>> sorted(sorted(lst), key=lambda s: '*' in s)
['A0', 'A1', 'AB', 'A*0', 'A*1']

如果想一次性得到结果,可以让key函数生成元组:

>>> sorted(lst, key=lambda s: ('*' in s, s))
['A0', 'A1', 'AB', 'A*0', 'A*1']

这可能有点慢(因为你需要构建元组),但我认为它更容易理解。

如果对关键参数还不够了解,可以参考:key function