You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:47:07