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

2024-06-09 23:19:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想实行考勤制度。我有两个列表,我已经把它们转换成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

我可以得到一些建议或指导,我应该如何进行这项工作。你知道吗


Tags: 代码log元素列表time方式时间unix
2条回答

你为什么不用datetime? 用这样的东西

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是从 到达时间比开始时间早5分钟

可以使用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.")

相关问题 更多 >