Boolen проверяет, находится ли datetime.now () между значениями любого кортежа в списке кортежей - PullRequest
2 голосов
/ 09 марта 2019

У меня есть список кортежей, который выглядит следующим образом:

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

Какой самый эффективный способ сделать это с помощью питона?Извините за вопрос для начинающих.

это работает, но мне не нравятся len():

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

какие-либо предложения лучше?

Ответы [ 2 ]

2 голосов
/ 09 марта 2019
any(map(lambda d: d[0] <= now <= d[1], hours))
  • any: логическое ИЛИ для всех элементов
  • карта: запускает функцию для каждого элемента списка

Как указал @steff, map избыточен, потому что мы вызываем перечисление напрямую.

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

Было бы намного лучше, если бы мы могли избежать индексации в кортеже и каким-либо образом использовать распаковку кортежа (по этой причине я начал с map)

1 голос
/ 09 марта 2019

Более подробная альтернатива.(Но более читабельно в моих глазах)

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
...