Python如何根据目标日期列表获取原日期列表中的匹配元素索引
获取长列表中匹配短列表元素的索引
问题背景
我手头有两个日期列表:一个是存储唯一日期字符串的长列表,另一个是包含我关注日期的短列表,具体如下:
dates = ['20171021', '20171031', '20171102', '20171225', '20180101', '20180106', '20180126', '20180131', '20180312', '20180315', '20180330', '20180409', '20180414', '20180419', '20180421', '20180424', '20180426', '20180429', '20180501', '20180516', '20180524', '20180603', '20180605', '20180608', '20180613'] selected_dates = ['20171021', '20180106', '20180414', '20180426']
我需要拿到长列表中,和短列表里日期匹配的元素的索引,期望结果是[0, 5, 12, 16]。我知道单个日期可以用dates.index('某个日期')获取索引,但直接把短列表塞进去dates.index(selected_dates)肯定不行——因为它会判断整个短列表是不是长列表里的元素,而不是逐个匹配里面的日期。
解决方案
方案1:列表推导式(简单直观,适合小数据量)
既然单个日期的索引能拿到,那直接遍历短列表里的每个元素,逐个调用index()就好,用列表推导式一行就能搞定:
indices = [dates.index(date) for date in selected_dates]
因为题目里明确说dates里的日期都是唯一的,所以不用担心index()返回错误的索引(如果有重复元素,index()只会返回第一个匹配项,但这里不存在这个问题)。运行这段代码就能得到你想要的[0, 5, 12, 16]。
方案2:预构建字典映射(高效,适合大数据量)
如果你的dates列表非常长,多次调用index()会有点慢——毕竟每次index()都要从头遍历整个列表找匹配项。这时候可以先建立一个「日期-索引」的字典映射,之后直接通过字典查找索引,效率会高很多:
# 先把日期和对应的索引存到字典里 date_index_map = {date: idx for idx, date in enumerate(dates)} # 遍历短列表,从字典里取对应的索引 indices = [date_index_map[date] for date in selected_dates]
这个方法的时间复杂度是O(n)(n是dates的长度),而列表推导式的方法是O(m*n)(m是selected_dates的长度),当数据量很大的时候,这种方法的优势会很明显。同样,因为dates里的日期唯一,字典不会有键冲突的问题,直接取值就没问题。
内容的提问来源于stack exchange,提问作者ABC
相关产品推荐
相关产品推荐

