2011-09-21 185 views
0

短重命名/對Web服務器固定記錄模塊......當我做了list.sort(),列表中的條目得到安置順序如下:蟒蛇排序列表

2011-09-21 19:15:54,731 DEBUG __main__ 44: running www.site.com-110731.log.0.gz 
2011-09-21 19:15:54,731 DEBUG __main__ 44: running www.site.com-110731.log.1.gz 
2011-09-21 19:15:54,731 DEBUG __main__ 44: running www.site.com-110731.log.2.gz 
2011-09-21 19:15:54,732 DEBUG __main__ 44: running www.site.com-110731.log.3.gz 
2011-09-21 19:15:54,732 DEBUG __main__ 44: running www.site.com-110731.log.gz 

我會怎樣排序列表,以獲得(即eithout一個數字條目是第一個):

2011-09-21 19:15:54,732 DEBUG __main__ 44: running www.site.com-110731.log.gz 
2011-09-21 19:15:54,731 DEBUG __main__ 44: running www.site.com-110731.log.0.gz 
2011-09-21 19:15:54,731 DEBUG __main__ 44: running www.site.com-110731.log.1.gz 
2011-09-21 19:15:54,731 DEBUG __main__ 44: running www.site.com-110731.log.2.gz 
2011-09-21 19:15:54,732 DEBUG __main__ 44: running www.site.com-110731.log.3.gz 

THANKS !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!

回答

4

你可能想寫一個自定義比較器傳遞給sort;事實上,你可能需要,因爲你可能會得到一個字典排序順序,而不是預期的(我假設)數字順序。例如,如果您知道文件名只會在這些數字上有所不同,您可以編寫一個比較器來提取這些數字,將它們轉換爲int,然後根據該值進行比較。

以你的例子作爲典型,你比較可能是這個樣子:

import re 
def extract(s): 
    r = re.compile(r'\.(\d+)\.log\.((\d*)\.)?gz') 
    m = r.search(s) 
    file = int(m.group(1)) 
    if not m.group(2): 
     return (file, -1) 
    index = int(m.group(3)) 
    return (file, index) 

def comparator(s1, s2): return cmp(extract(s1), extract(s2)) 

這更喜歡基於「文件」號(第一個)進行排序,然後按「指數」號(第二個)。請注意,它利用了元組上使用cmp的事實,因爲我們需要。

+0

嗯...我知道110701.log.gz總是會先,然後是.log.1.gz .log.2.gz等 – Cmag

+0

這是一個關閉袖口,但似乎工作作爲你似乎打算。如果這是「嚴肅的商業」,你應該在'extract'之外編譯正則表達式。 –

+0

啊,我錯過了最後一個例子!我會編輯'extract'。 –