2017-01-31 28 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

相關問題