2011-09-21 218 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'。 –