排序列表但将星号从第一个更改为最后一个
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
排序列表时,我认为 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