2016-05-17 85 views
1

我正在努力使排行榜。 這裏是一個名單上有:排序字符串伴隨列表中的整數

list=['rami4\n', 'kev13\n', 'demian6\n'] 

我希望能夠對此列表進行排序,從最高數字到最小,甚至最小的到最大,讓這樣的:

list=['kev13\n', 'demian6\n', 'rami4\n'] 

我試着使用像re.findall('\d+', list[loop])[0]這樣的東西,但我只設法從列表中得到最好的球員。不想重複儘可能多的玩家的代碼,有沒有人有想法?

回答

3

您確實必須使用re模塊,但也可以使用sort()方法的key參數。

reg = re.compile('\w*?(\d+)\\n') 
lst.sort(key=lambda s: int(reg.match(s).group(1))) 

它使用findall()像你一樣也能正常工作:

reg = re.compile('\d+') 
lst.sort(key=lambda s: int(reg.findall(s)[0])) 

注意,我compile()正則表達式,因此計算一勞永逸,而不是在列表中的每個元素。

+0

感謝德爾甘,工作。但是,你能解釋一下關於你使用的compile()嗎? –

+0

@ArwanCredoz一些信息,[這裏](https://msdn.microsoft.com/library/8zbs0h2f%28v=vs.110%29.aspx)。簡而言之,正則表達式是一個字符串,首先轉換爲一系列指令,然後將其應用於您的字符串以進行匹配。編譯保存了第一步,因此如果必須將相同的正則表達式匹配到多個字符串,請提高速度。實際上,這並不重要,因爲Python內部緩存了計算的正則表達式。但我認爲最好的做法是明確地做到這一點。 – Delgan

1

我有一個基於面向對象編程的其他解決方案,並且覆蓋__lt__str的特殊方法。

import re 

class SpecialString(str): 
    def __lt__(self, other): 
     pattern=re.compile(r"\d+") 
     return int(pattern.search(str(self)).group(0)) < int(pattern.search(str(other)).group(0)) 

if __name__ == "__main__": 
    listing = ['rami4\n', 'kev13\n', 'demian6\n'] 
    spe_list = [SpecialString(x) for x in listing] 
    spe_list.sort() 
    print(spe_list) 

哪個打印到標準輸出:

['rami4\n', 'demian6\n', 'kev13\n'] 

這種方法可以讓你不寫sort功能,並使用內置的一個(這可能是最優化)。更重要的是,因爲你的字符串可能被認爲是「專業化的str類」,所以繼承機制是非常合適的,因爲你保留了所有的屬性,但是重新編寫了比較機制。