通过比较Python中的值进行排序

时间:2011-07-11 19:53:46

标签: python sorting compare

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

我需要按[level]对这些行进行排序,并在STDOUT中显示结果。但是有两个条件:我们必须有机会选择用于排序的[level]名称,并且所有具有upper [level]的行也应该显示。

[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 个答案:

答案 0 :(得分:4)

我将此分为两部分:

1)编写一个函数,给定文件的一行,返回级别编号。将此level_number称为第2部分。

2)在您选择的排序调用中使用该函数和key参数:

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

可以使用拆分或正则表达式创建1)的函数。

答案 1 :(得分:2)

快速单行,让您有一些想法从文本行获取密钥:

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

请勿在生产代码中使用此功能,请记住"readability counts"

答案 2 :(得分:2)

这是工作代码(我无法帮助,即使@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)

注意,我在每个部分都包含了正则表达式组(这可能会方便进一步处理)。 HTH。