在python中迭代几个具有不同条件的列表

时间:2016-12-06 22:55:52

标签: python list loops if-statement iteration

任务:移动物体每秒测量一些参数,应与每10分钟测量的十个静止物体的测量结果进行比较。

条件:移动物体应位于距其中一个静止物体100米的范围内,并且在移动和静止测量之间的时间差为±5分钟,以便能够比较参数。

列表: time_m,time_s,lon_m,lat_m,lon_s,lat_s,param1_m,param1_s,param2_m,param2_s等(m表示移动,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])

谢谢!

1 个答案:

答案 0 :(得分:0)

一种解决方案可以对列表进行排序,并使用bisect查找lon_m中元素的lon_s项。这会将n^2缩减为n*logn。更复杂的版本将使用r-trees(有一些Python实现here)。 旁注:x >= A and x <= B通常在Python中写为A <= x <= B