如何在二维日期列表中确定输入一维日期的对应索引?
问题分析
你的原代码逻辑完全错误:它将日期的年、月、日拆分开单独比较,只要输入日期的年小于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
相关产品推荐
相关产品推荐

