2010-11-07 14 views
7

Mam listę tych elementów:Znajdź najbliższą godzinę

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

Zakładając, że teraz jest 20:18, w jaki sposób mogę uzyskać '20: 10' element z listy? Chcę tego użyć, aby znaleźć bieżący program telewizyjny w Przewodniku telewizyjnym.

+3

co pan spróbować? dlaczego to nie zadziałało? – carlosdc

+1

Jakie podejścia do tej pory próbowaliście, ale nie działają? –

+2

Jaki wynik chcesz, jeśli jest teraz 20:25? 20:30 jest najbliższy, ale jest w przyszłości, więc nie może być bieżącym programem bieżącym ... –

Odpowiedz

8
>>> 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' 
+2

+1 za wykonanie czynności, o które poprosił OP (znalezienie najbliższej godziny), ale napisał też, że chce znaleźć "bieżący show" - więc dla '20: 22' dostajesz' 20: 30', co oczywiście nie jest aktualnie uruchomionym programem. –

1

Możesz korzystać z funkcji w module czasu; time.strptime() umożliwia analizowanie ciągu znaków w krotce czasowej, a następnie time.mktime() zamienia to na sekundy. Następnie możesz po prostu porównać wszystkie przedmioty w ciągu kilku sekund i znaleźć najmniejszą różnicę.

1
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] 

Nadzieja ta może pomóc :)

+2

Zakłada się, że czasy z jednocyfrowymi godzinami lub minutami są oznaczone zerami na początku dla odpowiednich wartości. –

+0

może je konwertować od początku przed wywołaniem bisect.bisect – mouad

+0

bisect działa, jeśli lista jest posortowana. Rozważmy 'godziny = ['19: 30 ', '20: 10', '20: 30 ', '23: 00', '21: 00 ', '22: 00']' – khachik

2

nie jestem programista Python, ale chcę użyć następującego algorytmu:

  1. Konwersja wszystko „minut po północy” np hours = [1170 (= 19*60+30), 1210, ...], currenttime = 1218 (= 20*60+18).

  2. Następnie wystarczy pętla thorugh hours i znaleźć ostatni wpis, który jest mniejszy niż currenttime.

+0

+1: To faktycznie rozwiązuje problem "aktualnie prowadzonego show". Być może najpierw trzeba będzie posortować czasy. –

1

@katrielalex & Tim

import itertools 
[x for x in itertools.takewhile(lambda t: now > datetime.datetime.strptime(t, "%H:%M"), hours)][-1] 
5

łatwe, ale brudny sposób

max(t for t in sorted(hours) if t<=now)