没有在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
感谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
答案 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
可以正常工作的事实。