Сортировка по сравнению значений в Python - PullRequest
2 голосов
/ 11 июля 2011

Новичку в Python нужна помощь!

У меня есть файл со структурой:

[timestamp] [level] [source] message

, который содержит следующие строки (например):

[Wed Oct 11 14:34:52 2000] [error] [client 127.0.0.1] error message
[Wed Oct 11 18:56:52 2000] [warning] [client 127.0.0.1] error message
[Wed Oct 11 22:15:52 2000] [critical] [client 127.0.0.1] error message

И мне нужно отсортировать эти строки по [уровню] и отобразить результат в STDOUT.Но есть два условия: у нас должна быть возможность выбрать имя [уровня], которое используется для сортировки, и все строки с верхним [уровнем] должны отображаться тоже.

[level] values:
critical = 50
error = 40
warning = 30
info = 20
debug = 10

Я решил сделать это с костюмами:

suits = {'critical': 50, 'error': 40, 'warning': 30}
l = ['critical','error','warning']
print sorted(l, key=suits.get)

Но я полагаю, это не самый лучший способ.

Надеюсь, вы поможете мне решить эту проблему ...

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

Я бы разделил это на две части:

1) Напишите функцию, которая, учитывая строку файла, возвращает номер уровня. Вызовите этот номер_уровня для части 2.

2) Используйте эту функцию с ключевым параметром в выбранном вами вызове сортировки:

with open(fname) as f:
  sorted_lines = sorted(f, key=level_number)

Функция для 1) может быть создана с помощью разбиения или регулярного выражения.

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

Вот рабочий код (я не мог помочь, хотя @Hamidi сказал: «Мы не напишем вашу программу для вас»;)

import re

PAT = re.compile(r'\[(?P<time>[^\]]+)\] \[(?P<level>[^\]]+)\] \[(?P<client>[^\]]+)\] (?P<message>\S+)')
LEVELS = ['critical', 'error', 'warning', 'info', 'debug']

def level_number(line):
    match = PAT.match(line)
    if match:
        level = PAT.match(line).groupdict()['level']
        return LEVELS.index(level)
    return len(LEVELS)

with open('log.txt') as f:
    result = sorted(f, key=level_number)

Обратите внимание, я включил регулярное выражение с группами для каждой части (это может пригодиться для дальнейшей обработки). НТН.

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

Быстрый однострочник, чтобы дать вам представление о том, как получить ключ из текстовой строки:

{'critical': 50, 'error': 40, 'warning': 30, 'info': 20, 'debug': 10}.get(line.split('] [')[1].lower(), 0)

Не используйте это в производственном коде, помните, "читаемость рассчитывает"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...