python – 搜索按整数时间戳排序的列表的简单方法

我有一个表单的日志记录条目列表:

[{'time': 199920331000, 'message': 'message1'}, {'time': 199920331001, 'message': 'message2'}...]

其中时间值总是通过列表增加.如果我想在给定时间戳之后获取日志,我可以遍历元素,直到看到大于给定时间戳的时间戳:

def getLog(timestamp):
    global logs
    for x in range(len(logs)):
        if logs[x]['time'] > timestamp:
            return logs[x:]
    return []

我想在python 3中已经有一个快速搜索机制,但不知道在哪里看.

最佳答案 如果我理解正确,那么您正在寻找
bisect module,它实现了一种有效的算法,用于查找排序列表中的值大于或小于给定值的点.

您的日志条目必须是实现某种形式的排序的类.像这样的东西:

from functools import total_ordering

@total_ordering
class LogEntry(object):
    def __init__(self, time, message):
        self.time = time
        self.message = message

    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            return NotImplemented
        return self.time == other.time and self.message == other.message

    def __lt__(self, other):
        if not isinstance(other, self.__class__):
            return NotImplemented
        if self.time == other.time:
            return self.message < other.message
        return self.time < other.time

这些LogEntry类是可订购的(在functools.total_ordering class decorator的帮助下),因此bisect模块知道哪些条目具有比其他值更低的值.

你的功能变成:

def getLog(timestamp):
    dummy_entry = LogEntry(timestamp, '')
    index = bisect.bisect_right(logs, dummy_entry)
    return logs[index:]

请注意,我们不需要声明全局日志,因为您没有分配它.

点赞