如何找到列表中元素的所有出现位置
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
。