如何找到列表中元素的所有出现位置

594 投票
20 回答
807940 浏览
提问于 2025-04-16 19:15

index() 这个方法可以找到列表中某个元素第一次出现的位置。有没有什么简单的方法可以找到列表中某个元素的所有位置呢?

20 个回答

41

这里有一个使用 list.index 的解决方案:

def indices(lst, element):
    result = []
    offset = -1
    while True:
        try:
            offset = lst.index(element, offset+1)
        except ValueError:
            return result
        result.append(offset)

对于大列表来说,这种方法比使用 enumerate 的列表推导式要快得多。不过,如果你已经有了数组,那么它比 numpy 的解决方案要慢很多,因为转换的成本会超过速度的提升(在测试了包含100、1000和10000个元素的整数列表后得出的结论)。

注意:根据Chris_Rands的评论,有一点需要小心:如果结果比较稀疏,这种解决方案比列表推导式快,但如果列表中要查找的元素出现得很多(在测试中,如果列表中有超过大约15%的元素是要查找的,列表长度为1000的整数列表),那么列表推导式会更快。

174

虽然这不是直接解决列表的问题,但numpy在这方面表现得非常出色:

import numpy as np
values = np.array([1,2,3,1,2,4,5,6,3,2,1])
searchval = 3
ii = np.where(values == searchval)[0]

返回结果:

ii ==>array([2, 8])

对于元素数量很多的列表(数组),这可能比其他一些解决方案要快得多。

864

你可以用一种叫做列表推导式的方法,结合 enumerate 来实现:

indices = [i for i, x in enumerate(my_list) if x == "whatever"]

这个迭代器 enumerate(my_list) 会为列表中的每个项目生成一对数据 (索引, 项目)。在循环中使用 i, x 作为变量,可以把这些对数据拆分成索引 i 和列表中的项目 x。我们会筛选出所有符合条件的 x,并选择这些元素的索引 i

撰写回答