为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐8265434 2021-11-09 14:32:10
这次我试图使用 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_productdef 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
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

为什么不在列表中找到 2 个最大数字并将它们相乘以获得最大乘积。找到列表的最大值,然后将其保存在某个变量中。从列表中删除它并再次找到最大值。然后将其与您保存的变量相乘。

至于你的代码,这条线是做什么用的?

input_n = int(input())

您没有在任何地方使用 input_n 变量。

和线:

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

您的代码将要求您提供 2 个输入。当您第一次输入您的输入时,它会保存在 input_n 变量中。然后你的第二个输入被保存为 input_numbers。您提供给程序的输入类型有问题。


查看完整回答
反对 回复 2021-11-09
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

如果我理解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):

    n = len(numbers)

    index1 = 0

    for i in range(n):

        if numbers[i] > numbers[index1]:

            index1 = i

    index2 = 0

    for i in range(n):

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

            index2 = i

    return numbers[index1] * numbers[index2]

但是您也可以使用max代替这两个循环:


def max_pairwise_product_fast(numbers):

    n = len(numbers)

    index1 = max(range(n), key=lambda i: numbers[i])

    index2 = max((i for i in range(n) if i != index1), key=lambda i: numbers[i])

    return numbers[index1] * numbers[index2]

或者对整个数组进行排序并选择最高的两个:


def max_pairwise_product_fast(numbers):

    second, first = sorted(numbers)[-2:]

    return first * second

但是请注意,如果列表包含负数,例如[1, 2, -3, -4]. 为此,您可以在列表中的所有数字都否定的情况下再次调用相同的函数,并选择两个结果中较高的一个。


查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信