Вам придется сортировать затем процеживают, а также проанализировать все даты в вашей структуре:
from datetime import datetime
certain_date = datetime.strptime(certain_date, '%H:%M %Y-%m-%d')
match = next((k for v, k in sorted((datetime.strptime(v, '%H:%M %Y-%m-%d'), k) for k, v in date_table.iteritems()) if v >= certain_date), None)
Демо:
>>> certain_date = datetime.strptime(certain_date, '%H:%M %Y-%m-%d')
>>> next((k for v, k in sorted((datetime.strptime(v, '%H:%M %Y-%m-%d'), k) for k, v in date_table.iteritems()) if v >= certain_date), None)
'this is example 1'
Альтернативой фильтровать все даты которые прибывают позже и ближе всех к вашему времени поиска:
from datetime import datetime, timedelta
parse = lambda d: datetime.strptime(d, '%H:%M %Y-%m-%d')
certain_date = parse(certain_date)
match = min(date_table, key=lambda k: parse(date_table[k]) - certain_date if parse(date_table[k]) > certain_date else timedelta.max)
Demo:
>>> min(date_table, key=lambda k: parse(date_table[k]) - certain_date if parse(date_table[k]) > certain_date else timedelta.max)
'this is example 1'
Вы действительно хотите пересмотреть свою структуру, и использовать что-то вроде очереди кучи или ВТКЕЕ, чтобы сохранить структуру данных более доступными для этого вида доступа.
Даже отсортированный список с разбираемых (datetime, key)
кортежей будет выполнять гораздо лучше, как bisect
module позволит вам найти свой «следующий» значение в O (журнал N) время, в отличие от O (N журнал N) для сортировки или O (n) для комплексного фильтра min()
.
Вы можете быстро превратить вашу структуру в такой список с:
from functools import total_ordering
@total_ordering
class Entry(object):
def __init__(dt, key):
self.dt = dt
self.key = key
def __eq__(self, other):
if not isinstance(other, type(self)): return NotImplemented
return self.dt == other.dt and self.key == other.key
def __lt__(self, other):
if not isinstance(other, type(self)): return NotImplemented
if self.dt < other.dt:
return True
return self.dt == other.dt and self.key < other.key
date_list = [Entry(datetime.strptime(v, '%H:%M %Y-%m-%d'), k) for v, k in date_table.iteritems()]
date_list.sort()
затем найти свой следующий матч с:
import bisect
match = date_list[bisect.bisect(date_list, Entry(current_date, None))]
и использовать bisect.insort()
сохранить список отсортирован.
быть .net парнем я искал вокруг, и я удивлен, питон не имеют встроенный bst ... если им не хватает чего-то, просто личное наблюдение btw..не делать с вашим ответом :) –
Я обнаружил, что деревья двоичного поиска всегда нуждаются в дополнительной настройке, которую трудно уловить в библиотеке , Они мертвы легко написать себе. –
Двоичные деревья поиска сами по себе легки, но они не хороши, они должны быть сбалансированы, что может быть немного больно. –