需求
python 有2个保存时间戳的list, listA 和 listB, 对于listA中的每一个时间戳元素cur_ts, 查找listB中 与cur_ts最接近的前后两个时间戳元素
代码
python
import bisect
# 示例数据
listA = [1, 5, 10, 15]
listB = [2, 6, 8, 12, 14, 18]
def find_closest_timestamps(listA, listB):
results = []
for cur_ts in listA:
pos = bisect.bisect_left(listB, cur_ts)
if pos == 0:
closest_before = None
closest_after = listB[0]
elif pos == len(listB):
closest_before = listB[-1]
closest_after = None
else:
closest_before = listB[pos - 1]
closest_after = listB[pos]
results.append((cur_ts, closest_before, closest_after))
return results
# 执行函数并打印结果
results = find_closest_timestamps(listA, listB)
for cur_ts, before, after in results:
print(f"当前时间戳: {cur_ts}, 最接近的前一个时间戳: {before}, 最接近的后一个时间戳: {after}")
以上代码的工作原理如下:
- 使用
bisect_left
在listB
中找到插入cur_ts
的位置pos
。 - 根据
pos
的值来确定cur_ts
在listB
中最接近的前后两个时间戳:- 如果
pos
为 0,说明cur_ts
小于listB
中的所有元素,此时没有比cur_ts
小的元素。 - 如果
pos
等于listB
的长度,说明cur_ts
大于listB
中的所有元素,此时没有比cur_ts
大的元素。 - 否则,
listB[pos - 1]
是最接近cur_ts
且小于cur_ts
的元素,listB[pos]
是最接近cur_ts
且大于等于cur_ts
的元素。
- 如果
运行这段代码,输出结果为:
当前时间戳: 1, 最接近的前一个时间戳: None, 最接近的后一个时间戳: 2
当前时间戳: 5, 最接近的前一个时间戳: 2, 最接近的后一个时间戳: 6
当前时间戳: 10, 最接近的前一个时间戳: 8, 最接近的后一个时间戳: 12
当前时间戳: 15, 最接近的前一个时间戳: 14, 最接近的后一个时间戳: 18
这样你就可以找到 listA
中每个时间戳在 listB
中最接近的前后两个时间戳了。