列出界限索引,并堆栈溢出错误



我这次尝试使用Python来获得最大对的产品,而某些方面的概念对我来说仍然是新的。考虑到我无法选择Python中的类型,我继续从界限错误和堆叠式流体中获得列表索引。

我调查了枚举和其他迭代(BLE)功能,但无济于事。ID回答了这可以帮助未来的人们从C迁移到Python的循环问题。

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个最大数字并乘以它们以获取最大产品。找到最大列表,然后将其保存在一些变量中。将其从列表中删除,然后再次找到最大值。然后将其乘以您保存的变量。

至于您的代码,这行是为了什么?

input_n = int(input())

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

和线:

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

您的代码会要求您提供2个输入。首次输入输入时,将其保存在Input_n变量中。然后,您的第二个输入保存为Input_numbers。您提供该程序的输入类型有问题。

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

最新更新