如何获取列表中首个存在于另一列表的元素的索引?
如何获取列表中首个存在于另一列表的元素的索引?
先明确下你的场景:
给定两个列表:
punc = ['.', '!', '?']tokens = ['today', 'i', 'went', 'to', 'the', 'park', '.', 'it', 'was', 'great', '!']
需要找到tokens里第一个属于punc的元素的索引,预期结果是6。
下面是几种靠谱的实现方式:
1. 直观的循环遍历法
这是最容易理解的基础写法,逐个检查每个元素,找到第一个匹配项就立刻停止:
punc = ['.', '!', '?'] tokens = ['today', 'i', 'went', 'to', 'the', 'park', '.', 'it', 'was', 'great', '!'] target_index = -1 for idx, token in enumerate(tokens): if token in punc: target_index = idx break print(target_index) # 输出:6
这里用enumerate()同时拿到元素的索引和值,一旦找到符合条件的元素就用break跳出循环,确保拿到的是第一个匹配的索引。
2. Pythonic的生成器表达式写法
要是想代码更简洁优雅,用生成器表达式配合next()函数是个很好的选择:
punc = ['.', '!', '?'] tokens = ['today', 'i', 'went', 'to', 'the', 'park', '.', 'it', 'was', 'great', '!'] # 生成所有匹配的索引,next()直接取第一个 target_index = next((idx for idx, token in enumerate(tokens) if token in punc), -1) print(target_index) # 输出:6
这里next()的第二个参数-1是默认值,如果tokens里没有任何元素在punc中,就会返回-1,避免程序抛出StopIteration异常。
优化小技巧
如果你的punc列表很大,token in punc的查找效率会比较低(时间复杂度O(n))。这时候可以把punc转换成集合,集合的查找是O(1)的,能显著提升性能:
punc_set = set(punc) target_index = next((idx for idx, token in enumerate(tokens) if token in punc_set), -1)
内容的提问来源于stack exchange,提问作者jo_
相关产品推荐
相关产品推荐

