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

如何在二维日期列表中确定输入一维日期的对应索引?

问题分析

你的原代码逻辑完全错误:它将日期的年、月、日拆分开单独比较,只要输入日期的年小于data中某个日期的任意分量(月或日)就减少n,这完全违背了日期比较的逻辑。比如对于data中的[2015,6,1],原代码会拿输入的年2015和该日期的月6、日1比较,2015<6和2015<1都不成立,所以不会减n,但实际上这个日期比输入的[2015,1,6]晚,应该被计入需要减去的数量。

解决方案

方案1:遍历逐个比较

直接遍历data中的每个日期,按照年→月→日的优先级判断是否晚于输入日期,统计这类日期的数量后,用初始总数减去该数量得到结果。

data = [[1972,1,1],[1972,6,1],[1973,1,1],
           [1974,1,1],[1975,1,1],[1976,1,1],
           [1977,1,1],[1978,1,1],[1979,1,1],
           [1980,1,1],[1981,6,1],[1982,6,1],
           [1983,6,1],[1985,6,1],[1988,1,1],
           [1990,1,1],[1991,1,1],[1992,6,1],
           [1993,6,1],[1994,6,1],[1996,1,1],
           [1997,6,1],[1999,1,1],[2006,1,1],
           [2009,1,1],[2012,6,1],[2015,6,1],
           [2017,1,1] ] # yyyy-mm-dd格式
date = [2015,1,6]

later_count = 0
for d in data:
    if d[0] > date[0]:
        later_count += 1
    elif d[0] == date[0]:
        if d[1] > date[1]:
            later_count += 1
        elif d[1] == date[1]:
            if d[2] > date[2]:
                later_count += 1

# 若你的初始n为27,替换len(data)为27即可
n = len(data) - later_count
print(n) # 符合预期的25(当data长度为27时)或26(长度为28时)

方案2:二分查找优化(适合大数据集)

由于data是按升序排列的,使用Python内置的bisect模块进行二分查找,效率远高于遍历。Python列表的比较会自动按元素顺序(年→月→日)进行,正好匹配日期的优先级。

import bisect

data = [[1972,1,1],[1972,6,1],[1973,1,1],
           [1974,1,1],[1975,1,1],[1976,1,1],
           [1977,1,1],[1978,1,1],[1979,1,1],
           [1980,1,1],[1981,6,1],[1982,6,1],
           [1983,6,1],[1985,6,1],[1988,1,1],
           [1990,1,1],[1991,1,1],[1992,6,1],
           [1993,6,1],[1994,6,1],[1996,1,1],
           [1997,6,1],[1999,1,1],[2006,1,1],
           [2009,1,1],[2012,6,1],[2015,6,1],
           [2017,1,1] ]
date = [2015,1,6]

# bisect_left返回第一个大于等于date的索引,该值即为早于date的日期数量
n = bisect.bisect_left(data, date)
print(n) # 同样符合预期结果

内容的提问来源于stack exchange,提问作者beenguin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:05:16