Python 3中bisect_left中的索引超出范围

问题描述 投票:0回答:1

我正在编写这段代码,其中我使用了bisect模块中的bisect_left函数,该模块是Python的第一方模块。我仅将其与两个参数一起使用,即sorted_list和target(我必须为其找到合适的索引值的参数)。

问题是:如果我的目标大于最小值和最大值的和,则该函数返回索引= len(sorted_li),由于该错误,我得到了索引错误。我可以使用try和,但除此之外,我很想知道为什么会这样。

以下是我的代码:

from bisect import bisect_left

li = [10,15,3,6,10]
k  = 19

def binary_search(sorted_list,target):

    index = bisect_left(sorted_list,target)

    print(index)

    if sorted_list[index] == target:
        return index

    else:
        return False

def function(sorted_li,k):

    """
    Given a list of numbers and a number k, return whether any two numbers from the list add up to k.
    For example, given [10, 15, 3, 7] and k of 17, return true since 10 + 7 is 17.
    """

    print(sorted_li)

    for i in range(len(sorted_li)):

        print('Next iteration')

        print(sorted_li[i])

        target = k - sorted_li[i]

        j = binary_search(sorted_li,target)

        if j:
            if j != i:
                print(sorted_li[i])
                print(sorted_li[j])
                return True
            else:
                if j + 1 < len(sorted_li):
                    if sorted_li[j+1] == target:
                        print(sorted_li[i])
                        print(sorted_li[j+1])
                        return True
                if j - 1 > 0:
                    if sorted_li[j-1] == target:
                        print(sorted_li[i])
                        print(sorted_li[j-1])
                        return True
    return False


if __name__ == "__main__":

    li.sort()
    a = function(li,k)
    print(a)

其输出如下:

When k > sum (li's lowest + li's greatest)

但是当我将k更改为18时,代码工作正常,输出如下:

When k <= sum (li's lowest + li's greatest)

我已经尝试过用各种数字表示相同的数字。输出保持不变。

python-3.x binary-search
1个回答
0
投票

您正在使用bisect_left,它的下一个用途是:它以x的插入点(在您的情况下为目标)寻找其,以保持排序顺序。

因此,对于您的情况,当您第一次调用16(19-3)时,它会使用二进制算法将您的数字与li列表中的项目进行比较,然后返回插入位置5,因为在您的列表[3,6,10,10,15]插入点应在15之后,这是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.