【问题标题】:Iterate over several lists with different conditions in python在python中迭代几个具有不同条件的列表
【发布时间】:2017-04-21 17:55:13
【问题描述】:

任务:一个移动的物体每秒测量一些参数,应该与每 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^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])

谢谢!

【问题讨论】:

    标签: python list loops if-statement iteration


    【解决方案1】:

    一种解决方案可以保持列表的排序并使用bisectlon_s 中的元素查找lon_m 项。这会将n^2 减少到n*logn。更复杂的版本将使用 r-trees(有一些 Python 实现 here)。 附注:x &gt;= A and x &lt;= B 在 Python 中通常写为A &lt;= x &lt;= B

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2013-10-07
      • 1970-01-01
      • 2022-06-11
      • 2019-11-01
      • 1970-01-01
      相关资源
      最近更新 更多