Python сортировка не сортировка Вывод счетчика должным образом - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь отсортировать минимальное время загрузки страницы и максимальное время загрузки страницы из 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']]

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Это струны. Равенство строк определяется первым символом первым, поскольку строки представляют собой последовательности. Первый символ здесь - di git. Строка с номером 6 в качестве первого символа является последней в этом порядке, поэтому строки сортируются правильно.

Чтобы исправить это, вам просто нужно сбросить значение в int.

Объекты последовательности обычно можно сравнивать с другими объектами того же типа последовательности. При сравнении используется лексикографический порядок: сначала сравниваются первые два элемента, и если они различаются, это определяет результат сравнения; если они равны, сравниваются следующие два элемента и так далее, пока не будет исчерпана любая последовательность. Если два сравниваемых элемента сами являются последовательностями одного типа, лексикографическое сравнение выполняется рекурсивно. Если все элементы двух последовательностей сравниваются равными, последовательности считаются равными. Если одна последовательность является начальной подпоследовательностью другой, более короткая последовательность является меньшей (меньшей). В лексикографическом порядке строк используется номер кодовой точки Unicode для упорядочивания отдельных символов. Некоторые примеры сравнения последовательностей одного типа:

https://docs.python.org/3/tutorial/datastructures.html#comparing -sequences-and-other-types

1 голос
/ 12 июля 2020

сортировка по строке, а не по номеру

и '3'> '2'

если вы хотите сортировать по номеру, измените лямбду на:

key=lambda i: int(i[0])
...