说我有一个列表t = list(i for i in np.arange(0.5,10.5,0.5))
。我想在s=[3,5,7]
中找到t
的索引位置。我知道我可以通过t.index(s)
循环来做到这一点,但有更优雅的方式吗?
答案 0 :(得分:5)
重要的是要意识到你总是需要一些循环。即使t.index
做了一个循环,它只是隐藏它!但是据我所知,Python标准库中没有任何函数可以避免s
上的显式循环。
然而,人们可以提高效率(我的意思是比[t.index(needle) for needle in s]
更有效率)!特别是如果您的列表已排序。
您已使用NumPy
,因此np.searchsorted
肯定会很快:
import numpy as np
t = np.arange(0.5,10.5,0.5)
s = [3, 5, 7]
np.searchsorted(t, s)
如果你想留在Python中,还有bisect
模块,它至少可以保存一些(隐式)循环:
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]