Python 不使用 for 循环查询列表

标签 python python-3.x list binary-search

我想在 python 列表中找到一对数字的和。

  1. 列表已排序
  2. 需要检查连续的组合
  3. 避免使用 for 循环

我使用了 for 循环来完成工作并且工作正常。我想学习其他优化方法来获得相同的结果。

在不使用 for 循环的情况下,我可以通过其他方式获得相同的结果吗?

在这种情况下我如何使用二分搜索?

这是我的代码:

def query_sum(list, find_sum):
    """
    This function will find sum of two pairs in list
    and return True if sum exist in list
    :param list:
    :param find_sum:
    :return:
    """
    previous = 0
    for number in list:
        sum_value = previous + number
        if sum_value == find_sum:
            print("Yes sum exist with pair {} {}".format(previous, number))
            return True
        previous = number

x = [1, 2, 3, 4, 5]
y = [1, 2, 4, 8, 16]

query_sum(x, 7)
query_sum(y, 3)

这就是结果。

Yes sum exist with pair 3 4
Yes sum exist with pair 1 2

最佳答案

如果您的列表已排序(并且您只查看连续元素的总和),您确实可以使用二分搜索,因为总和也将单调递增。在 N 个元素的列表中,有 N-1 个连续的对。您可以复制并粘贴在线找到的任何正确实现的二分搜索算法,并将条件替换为连续元素的总和。例如:

def query_sum(seq, target):
    def bsearch(l, r):
        if r >= l:
            mid = l + (r - l) // 2
            s = sum(seq[mid:mid + 2])
            if s == target:
                return mid
            elif s > target:
                return bsearch(l, mid - 1)
            else:
                return bsearch(mid + 1, r)
        else:
            return -1
    i = bsearch(0, len(seq) - 1)
    if i < 0:
        return False
    print("Sum {} exists with pair {} {}".format(target, *seq[i:i + 2]))
    return True

IDEOne Link

您可以使用内置的 bisect 模块,但是您必须预先计算总和。这是一种更便宜的方法,因为您只需计算 log<sub>2</sub>(N)总和。

此外,此解决方案避免使用递归进行循环,但您最好编写像 while r >= l: 这样的循环。围绕逻辑而不是使用递归:

def query_sum(seq, target):
    def bsearch(l, r):
        while r >= l:
            mid = l + (r - l) // 2
            s = sum(seq[mid:mid + 2])
            if s == target:
                return mid
            elif s > target:
                r = mid - 1
            else:
                l = mid + 1
        return -1
    i = bsearch(0, len(seq) - 1)
    if i < 0:
        return False
    print("Yes sum exist with pair {} {}".format(*seq[i:i + 2]))
    return True

IDEOne Link

关于Python 不使用 for 循环查询列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57368215/

相关文章:

python - 在迭代列表时修改列表总是错误的吗?为什么?

python - 如何从 Notepad++ 中运行 Python 脚本,但使用 powershell 并在脚本目录中运行?

python-3.x - 线程 + 递归(需要 1 个位置参数,但给出了 39 个)

python - 从数组中获取行中元素满足条件的索引

python - "TypeError: ' 在函数签名中输入 ' object is not subscriptable"

python - Jupyter Notebook 上 Python 和 Windows 的文件路径

python - pickle 文件中的多个对象

python - 是否有用于共享运行/测试配置的基于 PyCharm 的工作流?

python - "WARNING:tornado.access:405"停止来自 "localhost"和 "file://"源的 POST 时出错

python - 如何对具有字符串格式的 float 和非数字值的列表进行排序?