如何将两个列表与要检查的条件进行比较?

时间:2018-04-04 12:36:20

标签: python list

我正在尝试实施考勤系统。我有两个列表,我已经将它们转换为Unix时间戳。一个列表包含修复时间表,另一个列表是学生的时间表。

例如,时间表列表可能包括

timetable[1519650000, 1519740000, 1519743600]
timetableEnd[1519653600, 1519743600, 1519747200]

log[1519739987, 1519744087]

以人类可读的方式但不在代码中

timetable[2018-02-26 13:00:00, 2018-02-27 14:00:00, 2018-02-27 15:00:00]
timetableEnd[2018-02-26 14:00:00, 2018-02-27 15:00:00, 2018-02-27 16:00:00]


log[2018-02-27 13:59:47, 2018-02-27 15:08:07]

是一种循环每个日志元素的方法,以检查将同意这种情况的时间表元素

  

a< = x< = b

Where a = timetable begin time - 5mins    
      x = log time    
      b = end time for timetable time

Example: (1519650000 - 300) <= x <= 1519653600
        return false since log doesnt have a value that satisfy this

我可以就如何进行此操作获得一些建议或指导。

2 个答案:

答案 0 :(得分:1)

您可以使用模式zip(a[:-1], a[1:])构建列表的邻居对,并且可以使用zip(a, b)将两个同等长的列表的元素配对。使用这两件事你可以试试这个:

if all(start-300 <= log_element <= end
       for ((start, end), log_element) in zip(
           zip(timetable[:-1], timetable[1:]), log)):
    print("All logs are in their boundaries.")

在您的情况下,由于log[1]不在timetable[1]-300timetable[2]之间,因此无法成功。

如果您不熟悉Python优雅的功能风格,您可能会发现它更易于理解(不太优雅):

def all_logs_in_boundaries(timetable, log):
    for ((start, end), log_element) in zip(
         zip(timetable[:-1], timetable[1:]), log)):
        if not (start-300 <= log_element <= end):
            return False
    return True  # or: print("All logs are in their boundaries.")

答案 1 :(得分:1)

为什么不使用日期时间? 使用类似这样的东西

import datetime
logtime = datetime.datetime.fromtimestamp(x)
begintime = datatime.datetime.fromtimestamp(a)
arrivaltime = logtime - datetime.timedelta(minutes=5)
return (arrivaltime <= logtime and logtime <= begintime)

logtime是x的日期时间 begintime是a的日期时间 到达时间比开始时间早5分钟