2016-12-06 84 views
1

任務:移動對象每秒測量一些參數,應與每10分鐘測量10個靜止對象的測量值進行比較。在python中使用不同條件迭代多個列表

條件:移動物體應該在距靜止物體100米的範圍內,並且在運動和靜止測量之間的時間差爲+5分鐘,以便能夠比較參數。

解釋: time_m,time_s,lon_m,lat_m,lon_s,LAT_S,param1_m,param1_s,param2_m,param2_s等。(米,用於移動和s爲靜止的(從10個靜止物體所有的測量均在相同的列表))

問題:由於列表大約有10^5次測量,所以我的兩個for循環和兩個if語句的解決方案花費的時間太長。請你能幫我解決這個問題嗎?

我的解決辦法:

dt_m = [datetime.datetime.strptime(item, '%Y-%m-%dT%H:%M:%S') for item in time_m] 
dt_s = [datetime.datetime.strptime(item, '%Y-%m-%dT%H:%M:%S') for item in time_s] 
d = datetime.timedelta(minutes=5) 
lon_hundred_m = 0.00180 #lon degrees for 100 m at lat 60 
lat_hundred_m = 0.00090 #lat degrees for 100 m 

for i in range(len(lon_m)): 
    for j in range(len(lon_s)): 
     if lon_m[i] >= (lon_s[j]-lon_hundred) and lon_m[i] <= (lon_s[j]+lon_hundred) and lat_m[i] >= (lat_s[j]-lon_hundred) and lat_m[i] <= (lat_s[j]+lon_hundred): 
      if dt_s[j] >= dt_m[i]-d and dt_s[j] <= dt_m[i]+d:     
       time_m_2.append(time_m[i]) 
       param1_m_2.append(param1_m[i]) 
       param2_m_2.append(param2_m[i]) 
       lon_m_2.append(lon_m[i]) 
       lat_m_2.append(lat_m[i]) 
       time_s_2.append(time_s[j]) 
       param1_s_2.append(param1_s[j]) 
       param2_s_2.append(param2_s[j]) 
       lon_s_2.append(lon_s[j]) 
       lat_s_2.append(lat_s[j]) 

謝謝!

回答

0

一個解決方案可以保持列表排序,並使用bisect找到lon_s中元素的lon_m項。這將減少n^2n*logn。更復雜的版本將使用r-trees(有一些Python實現here)。 A評論:x >= A and x <= B通常在Python中寫爲A <= x <= B)。