Найдите ближайший час - PullRequest
       4

Найдите ближайший час

7 голосов
/ 07 ноября 2010

У меня есть список с этими предметами:

hours = ['19:30', '20:10', '20:30', '21:00', '22:00']

Если предположить, что сейчас 20:18, как я могу получить из списка пункт 20: 10?Я хочу использовать это, чтобы найти текущее шоу в ТВ-гиде.

Ответы [ 6 ]

8 голосов
/ 07 ноября 2010
>>> import datetime
>>> hours = ['19:30', '20:10', '20:30', '21:00', '22:00']
>>> now = datetime.datetime.strptime("20:18", "%H:%M")
>>> min(hours, key=lambda t: abs(now - datetime.datetime.strptime(t, "%H:%M")))
'20:10'
5 голосов
/ 07 ноября 2010

простой, но грязный способ

max(t for t in sorted(hours) if t<=now)
2 голосов
/ 07 ноября 2010

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

  1. Преобразование всего в «минуты после полуночи», например, hours = [1170 (= 19*60+30), 1210, ...], currenttime = 1218 (= 20*60+18).

  2. Затем просто выполните цикл thorgh hours и найдите последнюю запись, которая меньше currenttime.

1 голос
/ 07 ноября 2010

@ katrielalex & Tim

import itertools
[x for x in itertools.takewhile( lambda t: now > datetime.datetime.strptime(t, "%H:%M"), hours )][-1]
1 голос
/ 07 ноября 2010
import bisect
# you can use the time module like katrielalex answer which a standard library 
# in python, but sadly for me i become an addict to dateutil :)
from dateutil import parser 

hour_to_get = parser.parse('20:18')

hours = ['19:30', '20:10', '20:30', '21:00', '22:00']
hours = map(parser.parse, hours) # Convert to datetime.

hours.sort() # In case the list of hours isn't sorted.

index = bisect.bisect(hours, hour_to_get)

if index in (0, len(hours) - 1):
    print "there is no show running at the moment"
else:
    print "running show started at %s " % hours[index-1] 

Надеюсь, это поможет вам:)

1 голос
/ 07 ноября 2010

Вы можете использовать функции в модуле времени;time.strptime() позволяет вам разобрать строку в кортеж времени, а затем time.mktime() преобразует это в секунды.Затем вы можете просто сравнить все элементы за секунды и найти наименьшую разницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...