在對串列進行排序時,我認為 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"]
uj5u.com熱心網友回復:
使用 鍵再次對現有排序結果進行排序:
>>> 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引數了解不夠,可以參考:key函式
uj5u.com熱心網友回復:
傳遞一個排序鍵,替換*為~
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']
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485229.html
