如何获取字典中字符串格式最新日期对应的键?现有方法返回错误结果
解决字典中字符串日期的最新日期键获取问题
这个问题我之前踩过坑!问题根源在于直接用字符串比较日期是不可靠的——Python对字符串的比较是逐字符按ASCII码来的,你示例里的"2018-02-2"和"2018-02-17",当对比到日期部分的第3位数字时,"2"的ASCII码比"1"大,所以字符串层面会判定"2018-02-2"更大,这才让max(date, key=date.get)返回了错误的buy_date。
正确的解决方法:将字符串转成datetime对象再比较
我们需要在max的key函数里,把每个键对应的日期字符串转换为Python的datetime对象,这样就能基于真实的日期时间大小来比较了:
from datetime import datetime date_dict = {"sale_date": "2018-02-17 20:11:37.017298", "buy_date": "2018-02-2 20:11:37.017298"} latest_key = max(date_dict, key=lambda k: datetime.strptime(date_dict[k], "%Y-%m-%d %H:%M:%S.%f")) print(latest_key) # 输出:sale_date
代码解释:
datetime.strptime():按照指定的格式(%Y-%m-%d %H:%M:%S.%f对应你的日期格式:年-月-日 时:分:秒.微秒),把字符串解析成datetime对象。lambda k: ...:作为max的key函数,传入每个键k,返回对应的datetime对象供max比较大小。
备选方案(不推荐):补全日期前导零
如果你的日期格式固定是ISO格式,也可以把日期部分的单数字补成两位(比如把"2018-02-2"改成"2018-02-02"),这样字符串比较就能正确排序。但这种方法局限性很大——一旦日期格式有变动(比如少了微秒、月份是单数字但没补零)就会失效,所以还是优先推荐转datetime的方法。
额外提醒
如果你的字典里可能存在无效的日期字符串,建议加上异常处理,避免程序崩溃:
from datetime import datetime date_dict = {"sale_date": "2018-02-17 20:11:37.017298", "buy_date": "2018-02-2 20:11:37.017298", "invalid_date": "not a date"} def parse_date(date_str): try: return datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S.%f") except ValueError: # 处理无效日期,比如返回一个极早的日期 return datetime.min latest_key = max(date_dict, key=lambda k: parse_date(date_dict[k])) print(latest_key) # 依然输出:sale_date
内容的提问来源于stack exchange,提问作者Shashank Srivastava
相关产品推荐
相关产品推荐

