python排序列表

时间:2011-09-21 23:29:19

标签: python

没有在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

我如何对列表进行排序,以获得(即输入数字为第一个):

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

感谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

1 个答案:

答案 0 :(得分: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可以正常工作的事实。