需求:求一个非减序列每个元素在一个大序列的位置(找到第一个大于或等于它的数的位置即可)
需求分析及代码实现:
传入多点序列(非减),计算出对应到的真实序列上的点序号
要考虑找不到的情况:【只需要查找对应点的时候如果小于前面部分用0,大于最后部分用-1即可】
def get_indexs_in_list(fr_points, x_list):
"""
方案1/3【最快!】
"""
# 查找序列的对应区间序号
indexs = list()
index = 0
for fr_point in fr_points:
if fr_point < x_list[0]:
indexs.append(0)
elif fr_point > x_list[-1]:
print(f"fr_point > x_list[-1]: {fr_point, x_list[-1]}")
indexs.append(-1)
else:
for x in x_list[index:]: # 基于fr_points是非减,j每次可以考虑从上次的地方开始查找
if x >= fr_point:
indexs.append(index)
break
index += 1
return indexs
def get_indexs_in_list_pro(fr_points, x_list):
"""
方案2/3
"""
# 查找序列的对应区间序号
indexs = list()
j = 0
for fr_point in fr_points:
if fr_point < x_list[0]:
indexs.append(0)
elif fr_point > x_list[-1]:
print(f"fr_point > x_list[-1]: {fr_point, x_list[-1]}")
indexs.append(-1)
else:
for k, v in enumerate(x_list[j:]): # 基于fr_points是非减,j每次可以考虑从上次的地方开始查找
if v >= fr_point:
index = k + j
indexs.append(index)
j = index
break
return indexs
def get_indexs_in_list_pro2(fr_points, x_list):
"""
方案3/3
"""
# 查找序列的对应区间序号
indexs = list()
item_num = len(fr_points)
i = 0
for k, v in enumerate(x_list): # 基于fr_points是非减,j每次可以考虑从上次的地方开始查找
if i >= item_num:
break
elif fr_points[i] < x_list[0]:
indexs.append(0)
elif fr_points[i] > x_list[-1]:
# print(f"fr_point > x_list[-1]: {fr_points[i], x_list[-1]}")
indexs.append(-1)
else:
# print(f"i: {i}")
# print(f"fr_points[i], v: {fr_points[i], v}")
while i < item_num and fr_points[i] <= v: # 这里用while
indexs.append(k)
i += 1
return indexs
结果:
每个函数执行200次(特定的两个序列)耗时对比:
get_indexs_in_list 耗时: 0.5059185028076172
get_indexs_in_list_pro 耗时: 0.5500645637512207
get_indexs_in_list_pro2 耗时: 1.063422441482544