Я пытаюсь отсортировать минимальное время загрузки страницы и максимальное время загрузки страницы из Apache файла журнала доступа. После синтаксического анализа файла журнала и сортировки с использованием сортировки я вижу странную сортировку.
#!/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'» для «Counter», поэтому мне нужно работать с кортежем. С сортировкой с использованием метода ниже аналогична та же история:
print(sorted(abcd(serve_time)))
[['1660'], ['1971'], ['2020'], ['2358'], ['2384'], ['2523'], ['2976'], ['3939'], ['455'], ['677']]