布尔检查datetime.now()是否在元组列表中任何元组的值之间

时间:2019-03-09 06:27:28

标签: boolean-logic python-3.7

我有一个看起来像这样的元组列表:

import datetime as dt
hours = [(dt.datetime(2019,3,9,23,0), dt.datetime(2019,3,10,22,0)),
        (dt.datetime(2019,3,10,23,0), d.datetime(2019,3,11,22,0))]

列表的长度是可变的,如果datetime.now()在列表中任何元组的第一和第二个元素之间,我只需要一个布尔值。 在NumPy中,我会这样做:

((start <= now) & (end >= now)).any()

以pythonic方式最有效的方法是什么?对不起初学者的问题。

这可行,但是我不喜欢len()

from itertools import takewhile
len(list(takewhile(lambda x: x[0] <= now and now <= x[1], hours ))) > 0

还有更好的建议吗?

2 个答案:

答案 0 :(得分:2)

any(map(lambda d: d[0] <= now <= d[1], hours))
  • 任何:对所有元素进行逻辑或
  • map:在列表的每个元素上运行一个函数

@steff指出map是多余的,因为我们直接导致列表枚举。

    any(d[0] <= now <= d[1] for d in hours)

如果我们能避免索引到元组并以某种方式使用元组拆包(这就是我从map开始的原因),那会更好。

答案 1 :(得分:1)

更详细的选择。 (但在我眼中更具可读性)

import datetime as dt


def in_time_ranges(ranges):
    now = dt.datetime.now()
    return any([r for r in ranges if now <= r[0] and r[1] >= now])


ranges1 = [(dt.datetime(2019, 3, 9, 23, 0), dt.datetime(2019, 3, 10, 22, 0)),
           (dt.datetime(2019, 3, 10, 23, 0), dt.datetime(2019, 3, 11, 22, 0)),
           (dt.datetime(2019, 4, 10, 23, 0), dt.datetime(2019, 5, 11, 22, 0))]

print(in_time_ranges(ranges1))

ranges2 = [(dt.datetime(2017, 3, 9, 14, 0), dt.datetime(2018, 3, 10, 22, 0)),
           (dt.datetime(2018, 3, 10, 23, 0), dt.datetime(2018, 3, 11, 22, 0)),
           (dt.datetime(2018, 4, 10, 23, 0), dt.datetime(2018, 5, 11, 22, 0))]

print(in_time_ranges(ranges2))

输出

True
False