[英]Sort list of strings considering two different criteria
我有以下列表:
l = ['hey (0)', 'hey (1)', 'bye (3)', 'bye (1)']
我想先按數字字符排序,然后按字母順序
output 應該是:
l = ['hey (0)','bye (1)', 'hey (1)', 'bye (3)']
試過:
l.sort(key = lambda x: (x[-2], x[1]))
有任何想法嗎?
你的方法幾乎是正確的。 一個錯誤是x[1]
按第二個字母而不是第一個字母對具有相同數值的元素進行排序。
您的解決方案也可以很好地推廣到其他輸入。 例如,它可能會在"product (5)"
"produce (5)"
,因為您沒有查看單詞中的所有字母。
您應該使用字符串的整個開頭( x[:-4]
將切斷數字、括號和空格),並可選擇將數字轉換為整數:
>>> l = ['hey (0)', 'hey (1)', 'bye (3)', 'bye (1)']
>>> l.sort(key=lambda x: (int(x[-2]), x[:-4]))
>>> l
['hey (0)', 'bye (1)', 'hey (1)', 'bye (3)']
這仍然不完全通用 - 例如,它僅在數字保證為 0 到 9 之間的整數時才有效,否則"foo (11)"
可能看起來小於"foo (9)"
。 在這種情況下,您可能想要使用更像 azro 解決方案的東西。
您需要更精確x[-2]
采用數字(但作為字符串),但x[1]
采用第二個字符,您需要整個單詞,正則表達式可以很好地做到這一點
import re
pattern = re.compile("(\w+) \((\d+)\)")
def sorter(value):
text, nb = pattern.findall(value)[0]
return int(nb), text
l = ['hey (0)', 'hey (1)', 'bye (3)', 'bye (1)']
l.sort(key=sorter)
print(l) # ['hey (0)', 'bye (1)', 'hey (1)', 'bye (3)']
或者沒有正則表達式
def sorter(value):
text, nb = value.split(" ")
return int(nb.strip("()")), text
l = ['hey (0)', 'hey (1)', 'bye (3)', 'bye (1)']
l.sort(key=sorter)
print(l) # ['hey (0)', 'bye (1)', 'hey (1)', 'bye (3)']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.