如何在元素存在于另一列表时截取目标列表对应位置前的内容
解决思路与代码实现
我来帮你搞定这个列表处理的需求~ 结合你说的科目和详情场景,核心逻辑是同步遍历两个顺序一致的列表,找到科目匹配对应详情的位置,再截取前置内容。
核心逻辑拆解
- 因为
SUBJECTS和DETAILS顺序严格对应,所以按索引同步遍历两个列表 - 对每个位置,检查当前科目是否包含在对应详情字符串里(毕竟详情带科目名称)
- 找到第一个满足匹配条件的位置后,直接截取该位置之前的所有科目
- 如果全程没有匹配项,可以返回空列表或者原列表(按需调整)
Python 实现代码
def filter_subjects(SUBJECTS, DETAILS): # 同步遍历科目和详情,拿到每个位置的索引、科目、详情 for idx, (subject, detail) in enumerate(zip(SUBJECTS, DETAILS)): # 检查科目是否在对应详情中存在 if subject in detail: # 返回该位置之前的所有科目 return SUBJECTS[:idx] # 没有找到任何匹配时,默认返回空列表,也可以改成return SUBJECTS return []
示例验证
示例1:含多班级科目场景
SUBJECTS = ["物理", "数学", "数学", "语文"] DETAILS = ["物理实验课详情", "数学一班(秋季)", "数学二班(春季)", "语文基础班"] result = filter_subjects(SUBJECTS, DETAILS) print(result) # 输出: ["物理"]
解释:第一个匹配的是索引1的「数学」出现在对应详情里,所以截取索引1之前的科目列表。
示例2:第一个元素就匹配
SUBJECTS = ["英语", "数学", "语文"] DETAILS = ["英语强化班详情", "数学进阶班", "语文写作班"] result = filter_subjects(SUBJECTS, DETAILS) print(result) # 输出: []
解释:索引0的「英语」直接匹配详情,所以截取之前的内容为空列表。
示例3:无匹配项
SUBJECTS = ["历史", "地理"] DETAILS = ["数学复习课", "英语听力课"] result = filter_subjects(SUBJECTS, DETAILS) print(result) # 输出: []
扩展调整
如果你的需求是截取到最后一个匹配位置之前,而不是第一个,可以用这个版本:
def filter_subjects_last(SUBJECTS, DETAILS): last_match_idx = -1 for idx, (subject, detail) in enumerate(zip(SUBJECTS, DETAILS)): if subject in detail: last_match_idx = idx return SUBJECTS[:last_match_idx] if last_match_idx != -1 else []
用示例1的输入,这个函数会返回["物理", "数学"]——因为最后一个匹配的是索引2的「数学」,截取到该位置之前的元素。
内容的提问来源于stack exchange,提问作者Fabricio Pirini
相关产品推荐
相关产品推荐

