Индекс списка вне границ и ошибка переполнения стека - PullRequest
0 голосов
/ 14 февраля 2019

В этот раз я пытаюсь получить максимальный парный продукт, используя python, и концепции некоторых аспектов все еще являются новыми для меня.Я продолжаю получать индекс списка ошибок за пределами границ и стековых потоков, с которыми я не знаю, как справиться, учитывая тот факт, что я не могу выбирать типы в Python.

Я изучил перечислимые и другие итеративные (ble) функции, но безрезультатно.Я ответил, что это может помочь будущим людям с простыми вопросами цикла при переходе от 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 ]

0 голосов
/ 14 февраля 2019

Если я правильно понимаю ваше 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].Для этого вы могли бы снова вызвать ту же функцию со всеми номерами в списке с отрицанием и выбрать самый высокий из двух результатов.

0 голосов
/ 14 февраля 2019

Почему бы вам не найти 2 максимальных числа в вашем списке и умножить их, чтобы получить максимальный продукт.найдите максимум списка, затем сохраните его в некоторой переменной.удалите его из списка и снова найдите максимум.затем умножьте это на сохраненную переменную.

для вашего кода, для чего эта строка?

input_n = int(input())

вы нигде не используете переменную input_n.

и строку:

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

ваш код запросит у вас 2 ввода.когда вы впервые вводите свои данные, они сохраняются в переменной input_n.тогда ваш второй ввод сохраняется как input_numbers.что-то не так с типом ввода, который вы даете программе.

...