Python实现:基于最近后续日期匹配并更新字典列表
完善Python字典列表的最近售卖项匹配逻辑
需求回顾
你需要给buy_lists里的每个购买项,从sell_lists中找到购买日期之后最近的售卖项,并把该售卖项的sell_date和sell_price字段添加到对应的购买项里。
基础实现方案
首先得解决日期比较的问题——字符串格式的日期没法直接计算差值,所以我们需要用datetime模块把日期转成可操作的对象。下面是完善后的代码:
import datetime # 这里要和你实际的日期格式匹配,比如'YYYY-MM-DD',如果是其他格式请调整 DATE_FORMAT = '%Y-%m-%d' for buy_item in buy_lists: # 将购买日期转换为datetime对象,方便后续比较 buy_date = datetime.datetime.strptime(buy_item['buy_date'], DATE_FORMAT) closest_sell = None min_time_diff = None # 用来记录最小的时间差 for sell_item in sell_lists: sell_date = datetime.datetime.strptime(sell_item['sell_date'], DATE_FORMAT) # 只考虑售卖日期在购买日期之后的项 if sell_date > buy_date: # 计算当前售卖项和购买项的日期差 time_diff = sell_date - buy_date # 如果是第一个符合条件的项,或者当前时间差更小,就更新最近售卖项 if min_time_diff is None or time_diff < min_time_diff: min_time_diff = time_diff closest_sell = sell_item # 根据是否找到匹配项,更新购买项 if closest_sell: buy_item['sell_date'] = closest_sell['sell_date'] buy_item['sell_price'] = closest_sell['sell_price'] else: # 没有找到符合条件的售卖项时,可以根据需求设置默认值 buy_item['sell_date'] = None buy_item['sell_price'] = None
关键逻辑说明
- 日期转换:用
strptime把字符串日期转成datetime对象,这样才能进行大小比较和差值计算,一定要保证DATE_FORMAT和你实际的日期格式一致(比如如果是'MM/DD/YYYY'就改成'%m/%d/%Y')。 - 筛选与匹配:遍历每个售卖项,只保留购买日期之后的项,然后通过比较时间差,找到距离最近的那个。
- 边界处理:如果没有找到任何在购买日期之后的售卖项,会给购买项设置
None值,你可以根据业务需求改成其他默认值(比如空字符串)。
优化方案(大数据量场景)
如果你的sell_lists数据量很大,上面的嵌套循环(时间复杂度O(n*m))效率会比较低。这时候可以先对sell_lists按日期排序,再用二分查找快速定位最近的项,把时间复杂度降到O(n log m):
import datetime import bisect DATE_FORMAT = '%Y-%m-%d' # 先对售卖列表按日期排序,只需要执行一次 sell_lists_sorted = sorted( sell_lists, key=lambda item: datetime.datetime.strptime(item['sell_date'], DATE_FORMAT) ) # 提取排序后的日期列表,用于二分查找 sorted_sell_dates = [ datetime.datetime.strptime(item['sell_date'], DATE_FORMAT) for item in sell_lists_sorted ] for buy_item in buy_lists: buy_date = datetime.datetime.strptime(buy_item['buy_date'], DATE_FORMAT) # 用bisect_right找到第一个大于buy_date的元素索引 match_idx = bisect.bisect_right(sorted_sell_dates, buy_date) if match_idx < len(sell_lists_sorted): # 找到最近的售卖项 closest_sell = sell_lists_sorted[match_idx] buy_item['sell_date'] = closest_sell['sell_date'] buy_item['sell_price'] = closest_sell['sell_price'] else: # 没有找到符合条件的项 buy_item['sell_date'] = None buy_item['sell_price'] = None
优化点说明
- 预排序:只需要对
sell_lists排序一次,后续每个购买项的查找都用二分查找,速度会快很多。 - 二分查找:
bisect_right会返回第一个大于目标值的元素索引,刚好就是我们要找的“最近的后续日期”项。
内容的提问来源于stack exchange,提问作者ProgR
相关产品推荐
相关产品推荐

