我这次尝试使用python来获取最大配对产品,某些方面的概念对我来说仍然是新的。我继续得到一个列表索引超出范围错误和stackoverflows我不知道如何处理鉴于我不能在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
或1
初始化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]
。为此,您可以再次调用相同的函数,并且列表中的所有数字都被取消,并选择两个结果中较高的一个。