您必须排序然后过滤,以及解析结构中的所有日期:
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)
演示:
>>> 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'
您真的想重新考虑您的结构,并使用诸如堆队列或 btree 之类的东西来使您的数据结构更易于进行这种访问。
即使是带有已解析(datetime, key)
元组的排序列表也会执行得更好,因为该bisect
模块可以让您在 O(log n) 时间内找到“下一个”值,而不是 O(n log 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()
用来保持列表排序。