индекс списка вне диапазона в функции python - PullRequest
1 голос
/ 07 октября 2019

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

Моя функция, которая зацикливает каждый столбец, по какой-то причине дает мне «индекс списка вне диапазона»

def max(input1,input2,input3):
  newArray= list(input3)
  seq =newArray
  num = input1
  num2 = input2
  max_row = 0
  max_column = 0
  avg = len(seq) / float(num)
  out = []
  last = 0.0

  while last < len(seq):
        out.append(seq[int(last):int(last + avg)])
        last += avg
  for i in out:
      # print(sum(i))
      if sum(i) > max_row:
        max_row = sum(i)
  # print(max_row)
  for i in range(0,len(out)):
     maxCols = 0
     sumCols = 0;

    #  print(out)
     for j in range(0,len(out[0])):
          print(i)
          sumCols = sumCols + out[j][i]
          if sumCols > maxCols:
             maxCols = sumCols
  # print(out)
  # print(maxCols)
  return maxCols + max_row
  # return seq


print(max(3,3,{3,6,9,1,4,7,2,8,9}))

Traceback (most recent call last):
  File "main.py", line 36, in <module>
    print(max(3,3,{3,6,9,1,4,7,2,8,9}))
  File "main.py", line 27, in max
    sumCols = sumCols + out[j][i]
IndexError: list index out of range

Ответы [ 3 ]

0 голосов
/ 07 октября 2019

Я рекомендую использовать Numpy для этой задачи. Он содержит объекты Matrix / Array, которые значительно упрощают вашу задачу.

import numpy as np

Определите вашу матрицу, используя np.matrix(), затем измените ее на np.array(). Вы можете определить его с помощью массива прямо вверх, но с помощью объекта Matrix вы можете записать свои значения в строковом формате, в то время как Array принимает список списков, который может сбить с толку.

Я предлагаю matrix_max()функция, которая принимает массив и перебирает строки и столбцы отдельно. Я дал ему имя, отличное от max, потому что (1) это имя встроенной функции Python и (2) оно нам все равно нужно:)

Как видите, for циклы итерируют сначала по строкам, а затем по столбцам (что совпадает со строками матрицы транспонирования). Функция max здесь проверяет новую сумму строки / столбца на соответствие существующему максимальному значению и, наконец, возвращает сумму обоих.

def matrix_max(array):

    max_row_sum = 0
    for row in array:
        max_row_sum = max(max_row_sum, sum(row))

    max_col_sum = 0
    for col in array.transpose():
        max_col_sum = max(max_col_sum, sum(col))

    return max_row_sum + max_col_sum

Используйте функцию в вашем примере матрицы:

m = np.matrix('3,6,9;1,4,7;2,8,9')
a = np.array(m)
print(matrix_max(a))

Распечатанный ответ: 44.

0 голосов
/ 07 октября 2019

sumCols = sumCols + out[j][i]sumCols = sumCols + out[i][j]

, если мы рассматриваем out как двумерную таблицу, i является ее первым измерением и представляет индекс строки, а j является ее вторым измерениеми представляет его индекс столбца. вы ошиблись, обменяв их.

также, питонский путь следующий:

sumCols += out[i][j]

0 голосов
/ 07 октября 2019

Set удалит повторяющиеся значения, поэтому ваш input3 станет [1,2,3,4,6,7,8,9] после первого шага функции max (), которая больше не является матрицей 3x3. Попробуйте использовать список или кортеж вместо набора в вашем input3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...