【发布时间】:2020-07-12 14:55:46
【问题描述】:
我正在尝试从 Apache 访问日志文件中整理出最小页面加载时间和最大页面加载时间。在解析日志文件并使用 sorted 排序后,我看到了奇怪的排序。
#!/usr/bin/python3
from collections import Counter
import re
import sys
logfile = sys.argv[1]
def abcd(match):
clean_log = []
for line in open(logfile):
try:
if re.findall(match, line):
clean_log.append(re.findall(match, line))
except ValueError:
pass
return(clean_log)
serve_time = "\d+$"
print(sorted(Counter(map(tuple, abcd(serve_time))).most_common(), key = lambda i: (i[0])))
上面的代码排序千分之一,然后才排序百:
$ ./log-parser.py access.log
[(('1660',), 1), (('1971',), 1), (('2020',), 1), (('2358',), 1), (('2384',), 1), (('2523',), 1), (('2976',), 1), (('3939',), 1), (('455',), 1), (('677',), 1)]
如您所见,455 和 677 位于末尾,但如果您分别查看千分之几和百分之几,则排序正确。
有人可以解释一下吗?
顺便说一句,如果我不使用映射到元组,我会收到“计数器”的“TypeError:unhashable type:'list'”错误,因此需要使用元组。使用下面的方法排序是同样的故事:
print(sorted(abcd(serve_time)))
[['1660'], ['1971'], ['2020'], ['2358'], ['2384'], ['2523'], ['2976'], ['3939'], ['455'], ['677']]
【问题讨论】:
标签: python sorting tuples counter