【问题标题】:List index out of bounds and stack overflow error列表索引越界和堆栈溢出错误
【发布时间】:2019-07-08 18:29:05
【问题描述】:

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

我查看了 enumerate 和其他 iterate(ble) 函数,但无济于事。我回答这可以帮助未来的人解决从 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

【问题讨论】:

标签: python stack-overflow indexoutofboundsexception


【解决方案1】:

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

至于你的代码,这一行是干什么用的?

input_n = int(input())

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

还有一行:

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

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

【讨论】:

  • 如果可以为负数,则为 2 分钟数的乘积。 (另外,我认为这正是 OP 在“快速”方法中试图做的。)
  • 我很确定我正在使用 input_n = int(input()) 作为程序输入,因为 1.) 它是由评分者提供给我的,2.) 当我自动删除程序时进入错误。我的意思是我明白你的意思,虽然哈哈,我知道他们为什么这样做。
  • 第一行(读取单个数字)可能是列表的长度。 Python 不需要,但其他语言需要。这并没有错。
【解决方案2】:

如果我正确理解您的max_pairwise_product_fast,您正在尝试找到最大和第二大的数字并将它们相乘。问题是您将index1 初始化为1,并将index2 初始化为12,但数组索引以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]。为此,您可以再次调用相同的函数,将列表中的所有数字都取反,然后选择两个结果中较高的一个。

【讨论】:

  • 我明白了——这是一种非常 Pythonic 的处理方式。我认为这门课程可能故意给了我不合理的代码,以便让我了解问题的调试、测试、故障排除和速度方面——我已经在 C++ 中做过一段时间,但现在想在 Python 中做。你说的每一句话都有道理,也调整了我的思维方式。我从 8 年级开始就一直在用 C/C++ 编写代码,而 Python 几乎看起来像是在作弊——但我喜欢它。
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 2014-06-06
  • 2015-03-22
  • 1970-01-01
  • 2011-10-30
  • 2013-10-13
相关资源
最近更新 更多