2017-01-31 27 views

回答

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] 
+2

如果你真的想要花哨(并且我喜欢搞过早的优化),你也可以对针列表进行排序,然后将先前找到的索引加1,作为'lo'参数设置为'bisect_left'。 –

+0

@DavidScarlett这取决于值的分布方式,因为'bisect'首先从中间索引开始(在'lo'和'hi'之间),但是下一个值接近最后找到的索引的机会很大(if它非常接近它需要很多的平分步骤)。所以你可能有更多的步骤,直到你找到下一个值。至少我发现它很少表现得更好,大部分时间都比较慢。 – MSeifert

相关问题