布尔检查 datetime.now() 是否在元组列表中任何元组的值之间
Boolen check if datetime.now() is between the values of any tuple in a list of tuples
我有一个元组列表,如下所示:
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
有更好的建议吗?
any(map(lambda d: d[0] <= now <= d[1], hours))
- any:所有元素的逻辑或
- map:对列表的每个元素运行一个函数
正如@steff 指出的那样 map 是多余的,因为我们直接导致列表枚举。
any(d[0] <= now <= d[1] for d in hours)
如果我们能避免索引到元组并以某种方式使用元组解包会更好(这就是我开始使用 map 的原因)
一个更冗长的选择。 (但在我看来更具可读性)
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
我有一个元组列表,如下所示:
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
有更好的建议吗?
any(map(lambda d: d[0] <= now <= d[1], hours))
- any:所有元素的逻辑或
- map:对列表的每个元素运行一个函数
正如@steff 指出的那样 map 是多余的,因为我们直接导致列表枚举。
any(d[0] <= now <= d[1] for d in hours)
如果我们能避免索引到元组并以某种方式使用元组解包会更好(这就是我开始使用 map 的原因)
一个更冗长的选择。 (但在我看来更具可读性)
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