有效地将单个值与间隔相关联

时间:2016-03-08 22:15:14

标签: python collections

我的情况是,我的时间粒度比定位粒度更精细。假设我正在以10 Hz的频率测量位置,但我正在以100 Hz进行其他测量。我想知道是否有人知道将位置与时间间隔相关联的聪明/有效方式?也就是说,给定落在该间隔内的时间,查找将返回适当的位置。可能只是涉及元组列表(start_time,end_time,position)和循环的简单实现不会是灾难性的,但我很想知道其他人是如何处理这类问题的。

2 个答案:

答案 0 :(得分:1)

您可以拥有一个将间隔起点或终点映射到位置的数据结构。为了计算你需要查找的间隔,要么对所讨论的时间值做一些适当的舍入(如果间隔可以被认为足够常规),或者使用bisect模块查找最近的所有发生间隔列表中的起点或终点。

答案 1 :(得分:1)

执行此操作的一种方法是存储字典键的排序列表(即时间值),并使用bisect库查找给定中间值的相应键

positions = {10: (1, 30), 20: (20, 30), 30: (40, 40)}

# In practice, you want to create and add to this list 
# the same time you add keys and values to the positions dictionary.
times = sorted(positions.keys())

t = 23
# Get the nearest time values (higher and lower)
# Test them both to see which is closer (ie. whether we
# should round up or down)
index = bisect.bisect(times, t)
l_i = max(index - 1, 0)
r_i = min(index, len(times) - 1)
if abs(times[l_i] - t) < abs(times[r_i] - t):
    t_nearest = times[l_i]
else:
    t_nearest = times[r_i]

position = positions[t_nearest]

每当您向位置字典添加新的time: position值时,请务必将时间密钥添加到times排序列表中。您可以使用bisect将其插入正确的位置

bisect.insort(times, 25)