用 Python 设计日志存储系统

pythonserver side programmingprogramming

假设我们有一些日志,每个日志包含一个唯一的 ID 和时间戳。时间戳是一个字符串,格式为:年:月:日:时:分:秒,例如 2019:01:01:23:59:59。所有域都是零填充的十进制数。

我们必须设计一个日志存储系统来实现以下功能 −

  • void Put(int id, string timestamp): 这将获取日志的唯一 ID 和时间戳,并将日志存储在存储系统中。

  • int[] Retrieve(String start, String end, String granularity): 这将返回时间戳在 start 到 end 参数范围内的日志的 ID。 granularity 参数表示要考虑的时间级别。例如,start = "2019:01:01:23:59:59"、end = "2019:01:02:23:59:59",granularity = "Day",这意味着我们需要查找 2019 年 1 月 1 日至 2019 年 1 月 2 日范围内的日志。

因此,如果输入如下

  • put(1, "2019:01:01:23:59:59");

  • put(2, "2019:01:01:22:59:59");

  • put(3, "2018:01:01:00:00:00");

  • retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Year");

  • retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Hour");

然后输出将是 [1,2,3],因为我们需要返回 2018 到 2019 范围内的所有日志和 [1,2],因为我们需要返回从2018:01:01:01 至 2019:01:01:23,其中 log 3 超出范围。

为了解决这个问题,我们将遵循以下步骤 −

  • 定义初始化程序。

  • logs := 一个新列表

  • 定义一个函数 put()。这将需要 id、timestamp

  • 在 logs 末尾插入 id、timestamp

  • 定义一个函数 tries()。这将需要 s、e、gra

  • index := 一个类似 {'Year':5, 'Month' : 8, 'Day' 的映射: 11, '小时' : 14, '分钟' : 17, '秒' :20}[gra]

  • start := s[从索引 0 到索引]

  • end := e[从索引 0 到索引]

  • 返回(每个 tid 的 tid,如果开始 <= timestamp[从索引 0 到索引] <= end,则返回日志中的时间戳)

示例

让我们看看下面的实现以便更好地理解 −

class LogSystem(object):
   def __init__(self):
      self.logs = []
   def put(self, id, timestamp):
      self.logs.append((id, timestamp))
   def retrieve(self, s, e, gra):
      index = {'Year':5, 'Month' : 8, 'Day' : 11, 'Hour' : 14, 'Minute' : 17, 'Second' :20}[gra]
      start = s[:index]
      end = e[:index]
      return (tid for tid, timestamp in self.logs if start <= timestamp[:index] <= end)
ob = LogSystem()
ob.put(1, "2019:01:01:23:59:59")
ob.put(2, "2019:01:01:22:59:59")
ob.put(3, "2018:01:01:00:00:00")
print(list(ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Year")))
print(list(ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Hour")))

输入

ob.put(1, "2019:01:01:23:59:59")
ob.put(2, "2019:01:01:22:59:59")
ob.put(3, "2018:01:01:00:00:00")
ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Year")
ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Hour")

输出

[1, 2, 3]
[1, 2]

相关文章


有用资源