检查一个值是否存在于列表中的最快速方法

什么是最快的方法来知道一个值是否存在于一个列表中(一个有数百万个值的列表),以及它的索引是什么?

我知道列表中的所有值都是唯一的,就像这个例子一样。

我尝试的第一种方法是(在我的真实代码中是3.8秒):

a = [4,2,3,1,5,6]

if a.count(7) == 1:
    b=a.index(7)
    "Do something with variable b"

我尝试的第二个方法是(快了2倍:我的真实代码为1.9秒):

a = [4,2,3,1,5,6]

try:
    b=a.index(7)
except ValueError:
    "Do nothing"
else:
    "Do something with variable b"

来自Stack Overflow用户的建议方法(我的真实代码为2.74秒):

a = [4,2,3,1,5,6]
if 7 in a:
    a.index(7)

在我的真实代码中,第一个方法需要3.81秒,第二个方法需要1.88秒。 这是一个很好的改进,但是。

我是Python/脚本的初学者,是否有更快的方法来做同样的事情并节省更多的处理时间?

对我的应用进行了更具体的阐述:

在Blender的API中,我可以访问一个粒子的列表。

particles = [1, 2, 3, 4, etc.]

从那里,我可以访问一个粒子的位置。

particles[x].location = [x,y,z]

对于每个粒子,我通过搜索每个粒子的位置来测试是否存在一个邻居,就像这样。

if [x+1,y,z] in particles.location
    "Find the identity of this neighbour particle in x:the particle's index
    in the array"
    particles.index([x+1,y,z])
解决办法
7 in a

最清晰、最快速的方法。

你也可以考虑使用 "集合",但从你的列表中构建该集合所花费的时间可能比快速成员测试所节省的时间更多。唯一能确定的方法是做好基准测试。(这也取决于你需要什么操作)

评论(7)

你可以把你的项目放入一个set。集合查询是非常有效的。

试试吧。

s = set(a)
if 7 in s:
  # do stuff

编辑 你在评论中说你想获得元素的索引。不幸的是,集合没有元素位置的概念。另一种方法是对你的列表进行预排序,然后在每次需要找到一个元素时使用二进制搜索

评论(3)
def check_availability(element, collection: iter):
    return element in collection

使用方法

check_availability('a', [1,2,3,4,'a','b','c'])

我相信这是知道所选数值是否在数组中的最快方法。

评论(5)