python,求一个非减序列每个元素在一个大序列的位置(找到第一个大于或等于它的数的位置即可)

需求:求一个非减序列每个元素在一个大序列的位置(找到第一个大于或等于它的数的位置即可)

需求分析及代码实现
传入多点序列(非减),计算出对应到的真实序列上的点序号
要考虑找不到的情况:【只需要查找对应点的时候如果小于前面部分用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值