我有以下字典:
history = {
"2008-11-17": 41,
"2010-05-28": 82,
"2008-11-14": 47,
"2008-11-13": 60,
"2008-11-12": 56,
"2008-11-11": 55,
"2008-11-10": 98,
"2008-11-19": 94,
"2008-11-18": 94,
"2004-05-27": 82,
"2004-05-26": 45,
"2004-05-25": 70,
# there's more ...
}
如何定义一个生成器函数 get_records(dict_history, str_from_date, str_to_date)
,以产生 date: record
条目?
我知道如何将 datetime
对象转换为任何我想要的字符串格式。然而,在这个障碍中,我的主要痛点是:
dict
不是有序的。dict
键是字符串。- 日期不连续。
到目前为止,这是我能想到的:
from datetime import datetime, timedelta
def get_records(history, start_date, end_date):
fmt = "%Y-%m-%d"
dt = timedelta(days=1)
present_date = datetime.strptime(start_date, fmt)
end_date = datetime.strptime(end_date, fmt)
while present_date <= end_date:
present_string = present_date.strftime(fmt)
try:
yield (present_string, history[present_string])
except KeyError:
pass
present_date += dt
有更有效的方法吗?
更新(2011年8月2日)
我在ActiveState找到了Raymond Hettinger创建的SortedCollection
类。
history
作为一个已排序的元组list
(这是可以做到的,因为我可以控制如何格式化history
),那么通过二分查找list
可能是一个不错的选择。但当我问自己“我该如何查询我想要的日期?”时,我就被卡住了。如果你能为此提供答案,我将非常欢迎。 - Kit