列表索引越界和堆栈溢出错误

这次我试图使用 python 获得最大的成对产品,某些方面的概念对我来说仍然是新的。我继续得到列表索引越界错误和计算器溢出,鉴于我无法在 Python 中选择类型,我不知道如何处理。


我查看了 enumerate 和其他 iterate(ble) 函数,但无济于事。Id 回答这可以帮助未来的人在从 C 迁移到 python 时解决简单的 for 循环问题。


def max_pairwise_product(numbers):

    n = len(numbers)

    max_product = 0

    for first in range(n):

        for second in range(first + 1, n):

            max_product = max(max_product,

                numbers[first] * numbers[second])


    return max_product


def max_pairwise_product_fast(numbers):

    n = len(numbers)

    index1 = 1

    for i in range(2,n,1):

        if (numbers[i]>numbers[index1]):

            index1 = i

    if (index1 == 1):

        index2 = 2

    else:

        index2=1

    for i in range(1,n):

        if(numbers[i]!=numbers[index1] and numbers[i]>numbers[index2]):

            index2 = i

    return (numbers[index1]*numbers[index2])

if __name__ == '__main__':

    input_n = int(input())

    input_numbers = [int(x) for x in input().split()]

    print(max_pairwise_product_fast(input_numbers))

Traceback (most recent call last):

  File "C:/Users/Tevin/.PyCharmCE2018.3/config/scratches/scratch_1.py", line 31, in <module>

    print(max_pairwise_product_fast(input_numbers))

  File "C:/Users/Tevin/.PyCharmCE2018.3/config/scratches/scratch_1.py", line 27, in max_pairwise_product_fast

    return (numbers[index1]*numbers[index2])

IndexError: list index out of range


慕姐8265434
浏览 139回答 2
2回答

MM们

为什么不在列表中找到 2 个最大数字并将它们相乘以获得最大乘积。找到列表的最大值,然后将其保存在某个变量中。从列表中删除它并再次找到最大值。然后将其与您保存的变量相乘。至于你的代码,这条线是做什么用的?input_n&nbsp;=&nbsp;int(input())您没有在任何地方使用 input_n 变量。和线:input_numbers&nbsp;=&nbsp;[int(x)&nbsp;for&nbsp;x&nbsp;in&nbsp;input().split()]您的代码将要求您提供 2 个输入。当您第一次输入您的输入时,它会保存在 input_n 变量中。然后你的第二个输入被保存为 input_numbers。您提供给程序的输入类型有问题。

小唯快跑啊

如果我理解max_pairwise_product_fast正确,您将尝试找到最大和第二大数字并将它们相乘。问题是您初始化index1为1, 并index2使用1or 2,但数组索引以0. 因此,对于只有两个元素的列表,您的代码将失败,例如[1,2]. 将起始索引更改为0,并相应地更改range循环中的 ,它将起作用。您还可以删除一些检查,例如if/else,因为这与您在第二个循环中进行的检查是多余的。此外,通过比较number[index1],number[index2]如果最高数字出现两次,您可能会错过最高产品,例如[1,2,2]。保持接近原始代码,您可以尝试以下操作:def max_pairwise_product_fast(numbers):&nbsp; &nbsp; n = len(numbers)&nbsp; &nbsp; index1 = 0&nbsp; &nbsp; for i in range(n):&nbsp; &nbsp; &nbsp; &nbsp; if numbers[i] > numbers[index1]:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index1 = i&nbsp; &nbsp; index2 = 0&nbsp; &nbsp; for i in range(n):&nbsp; &nbsp; &nbsp; &nbsp; if index2 != index1 and numbers[i] > numbers[index2]:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index2 = i&nbsp; &nbsp; return numbers[index1] * numbers[index2]但是您也可以使用max代替这两个循环:def max_pairwise_product_fast(numbers):&nbsp; &nbsp; n = len(numbers)&nbsp; &nbsp; index1 = max(range(n), key=lambda i: numbers[i])&nbsp; &nbsp; index2 = max((i for i in range(n) if i != index1), key=lambda i: numbers[i])&nbsp; &nbsp; return numbers[index1] * numbers[index2]或者对整个数组进行排序并选择最高的两个:def max_pairwise_product_fast(numbers):&nbsp; &nbsp; second, first = sorted(numbers)[-2:]&nbsp; &nbsp; return first * second但是请注意,如果列表包含负数,例如[1, 2, -3, -4]. 为此,您可以在列表中的所有数字都否定的情况下再次调用相同的函数,并选择两个结果中较高的一个。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python