Computer >> Máy Tính >  >> Lập trình >> Python

Thiết kế hệ thống lưu trữ nhật ký bằng Python

Giả sử chúng ta có một số nhật ký, mỗi nhật ký chứa một id và dấu thời gian duy nhất. Dấu thời gian là một chuỗi có định dạng:Năm:Tháng:Ngày:Giờ:Phút:Thứ hai, ví dụ:2019:01:01:23:59:59. Tất cả các miền đều là số thập phân không có đệm.

Chúng ta phải thiết kế một hệ thống lưu trữ nhật ký để thực hiện các chức năng sau -

  • void Put (int id, string timestamp):Thao tác này sẽ lấy id và dấu thời gian duy nhất của nhật ký và nó lưu trữ nhật ký trong hệ thống lưu trữ.

  • int [] Truy xuất (Bắt đầu chuỗi, Kết thúc chuỗi, Mức độ chi tiết của chuỗi):Điều này sẽ trả về id của nhật ký có dấu thời gian nằm trong phạm vi từ tham số đầu đến cuối. Thông số mức độ chi tiết cho biết mức thời gian cần xem xét. Ví dụ:start ="2019:01:01:23:59:59", end ="2019:01:02:23:59:59" và chi tiết ="Day", điều đó có nghĩa là chúng ta cần tìm nhật ký trong phạm vi từ ngày 1 tháng 1 năm 2019 đến ngày 2 tháng 1 năm 2019.

Vì vậy, nếu đầu vào giống như

  • đặt (1, "2019:01:01:23:59:59");

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

  • đặt (3, "2018:01:01:00:00:00");

  • truy xuất ("2018:01:01:01:01:01", "2019:01:01:23:00:00", "Năm");

  • truy xuất ("2018:01:01:01:01:01", "2019:01:01:23:00:00", "Hour");

thì đầu ra sẽ là [1,2,3] vì chúng ta cần trả lại tất cả nhật ký trong phạm vi 2018 và 2019 và [1,2], vì chúng ta cần trả lại tất cả nhật ký bắt đầu từ 2018:01:01:01 đến 2019:01:01:23, trong đó bản ghi 3 nằm ngoài phạm vi.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định trình khởi tạo.

  • nhật ký:=một danh sách mới

  • Định nghĩa một hàm put (). Thao tác này sẽ lấy id, dấu thời gian

  • chèn id, dấu thời gian vào cuối nhật ký

  • Định nghĩa một hàm truy xuất (). Điều này sẽ mất s, e, gra

  • index:=một bản đồ như {'Năm':5, 'Tháng':8, 'Ngày':11, 'Giờ':14, 'Phút':17, 'Thứ hai':20} [gra]

  • start:=s [từ chỉ mục 0 đến chỉ mục]

  • end:=e [từ chỉ mục 0 đến chỉ mục]

  • return (tid cho mỗi tid, dấu thời gian trong nhật ký nếu start <=timestamp [từ chỉ mục 0 đến chỉ mục] <=end)

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

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")))

Đầu vào

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")

Đầu ra

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