列表索引超出范围,并且堆栈溢出错误

时间:2019-02-14 16:49:39

标签: python stack-overflow indexoutofboundsexception

这次我正尝试使用python获得最大配对智能乘积,某些方面的概念对我来说仍然是新的。考虑到我无法选择Python中的类型,我继续获得超出范围错误和stackoverflows的列表索引,但我不知道如何处理。

我研究了枚举和其他迭代(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

2 个答案:

答案 0 :(得分:0)

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

关于您的代码,这行是做什么用的?

input_n = int(input())

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

和该行:

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

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

答案 1 :(得分:0)

如果我正确理解您的max_pairwise_product_fast,则表示您正在尝试找到最大和第二大数字并将它们相乘。问题是您将index1初始化为1,并用index21初始化了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]。为此,您可以在列表中所有数字取反的情况下再次调用同一函数,并从两个结果中取较高的一个。