在python中返回列表索引而不循环的优雅方法是什么?

在python中返回列表索引而不循环的优雅方法是什么?,python,list,Python,List,假设我有一个列表t=list(在np.arange(0.5,10.5,0.5)中I代表I))。我想在t中找到s=[3,5,7]的索引位置。我知道我可以通过t.index(s)循环来实现这一点,但有没有更优雅的方法 认识到你总是需要一些循环是很重要的。即使做了一个循环,它也会对你隐藏它!然而,据我所知,Python标准库中没有任何函数可以避免显式循环s 然而,我们可以使它更有效(我的意思是比[t.index(针)表示针在s中]更有效)!特别是如果你的列表已排序 您已经使用了NumPy,因此肯定会

假设我有一个列表
t=list(在np.arange(0.5,10.5,0.5)中I代表I))
。我想在
t
中找到
s=[3,5,7]
的索引位置。我知道我可以通过
t.index(s)
循环来实现这一点,但有没有更优雅的方法

认识到你总是需要一些循环是很重要的。即使做了一个循环,它也会对你隐藏它!然而,据我所知,Python标准库中没有任何函数可以避免显式循环
s


然而,我们可以使它更有效(我的意思是比
[t.index(针)表示针在s中]
更有效)!特别是如果你的列表已排序

您已经使用了
NumPy
,因此肯定会很快:

import numpy as np

t = np.arange(0.5,10.5,0.5)
s = [3, 5, 7]

np.searchsorted(t, s)
如果您想留在Python中,还有一个模块,它至少可以保存一些(隐式)循环:


该列表是否包含唯一值?嘿,是的,它包含唯一值。如果你真的想获得幻想(我指的是过早优化),你也可以对针列表进行排序,然后通过之前找到的索引,递增1,作为
lo
参数到
bisect\u left
@davidscallett,这取决于值的分布方式,因为
bisect
首先从中间索引开始(介于
lo
hi
之间),但很可能下一个值接近最后找到的索引(如果它非常接近,则需要大量的二分法步骤)。因此,在找到下一个值之前,您可能需要更多的步骤。至少我发现它很少表现得更好,大多数情况下,它的速度较慢。
from bisect import bisect_left

def index(a, x):  # Taken from the bisect documentation
    'Locate the leftmost value exactly equal to x'
    i = bisect_left(a, x)
    if i != len(a) and a[i] == x:
        return i
    raise ValueError

indices = [index(t, needle) for needle in s]