IndexError при получении суммы анти-диагонали моей матрицы (список списков) - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь получить сумму анти-диагонали матрицы.Используя мой код

r=int(input("Enter no of rows:"))
c=int(input("Enter no of cols:"))
a=[]
for i in range(r):
    a.append([0]*c)
print("Enter elements:")
for i in range(len(a)):
    for j in range(len(a[0])):
        a[i][j]=int(input())
for  i in range(len(a)):
    for j in range(len(a[0])):
        print(a[i][j],end=" ")
    print()
n=0    
for i in range(len(a)):
    for j in range(len(a),0,-1):
        z=a[i][j]+n
print(z)

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

  File "main.py", line 17, in <module>
    z=a[i][j]+n
IndexError: list index out of range

1 Ответ

1 голос
/ 04 мая 2019

В вашем коде несколько ошибок:

  • вы неправильно используете команду диапазона, первый индекс включительно , последний индекс эксклюзив -при движении в обратном направлении вам нужно (len-1,-1,-1) не (len,0,-1)
  • вы ошибаетесь, вы суммируете ВСЕ значения, а не только диагональ
  • вы суммируете неправильно, перезаписывая z каждый раз безувеличение n

См. встроенные комментарии об ошибках / исправлениях / улучшениях.

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

import random

r = 5
c = 5
a = []  

# add random numbers into list of list    
for i in range(r):
    a.append([])
    for j in range(c):
        a[-1].append(random.randint(1,500))

# print data formatted
# do not recalc len(a) / len(a[0]) all the time, use r and c
for  i in range(r):
    for j in range(c):
        print("{:>5}".format(a[i][j]),end=" ")
    print()

# sum anti diagonal
n=0    

# this calculates the sum of _all_ values, not of the diagonal 
# do not recalc len(a) / len(a[0]) all the time, use r and c 
for i in range(r):
    # for j in range(c,0,-1):  
    # range uses (inclusive,exclusive,step) limits - your c is 1 too high
    # because of 0-indexing. fix using 
    for j in range(c-1,-1,-1):
        # z=a[i][j]+n
        # you need to increment n - not do stuff to z
        n += a[i][j]
print(n)

Вывод:

   33    69   430   218    15 
  149   327    44    33   279 
  327    57   431    57   195 
  307   460   268   465   170 
  154   325   380    79   217 

5489  # sum of ALL values

Чтобы получить только диагональ, вам нужно сложить только 5 значений, вы зациклились на 5 * 5 значений.


Вы можете получитьправильные индексы, используя zip() из двух range () s:

# generating just the indexes you need
idx = list(zip(range(r),range(c-1,-1,-1)))  
print(idx)  #  [(0, 4), (1, 3), (2, 2), (3, 1), (4, 0)]

и суммируйте эти индексы.

Вы можете зацикливать эти кортежи - или использовать встроенные в функцию sum () питоны.

Вы можете использовать подсчет диапазонов вверх / вниз или подсчет диапазонов и индексирование отрицательного списка (эквивалент):

# using a range counting down for columns
print(sum( a[row][col] for row,col in zip(range(r), range(c-1,-1,-1)) ))

# using negative list indexing and a range counting upwards
print(sum( a[row][-col-1] for row,col in zip(range(r), range(c)) ))

Выход:

1093 # twice

Для заполнения a вы также можете использовать понимание списка:

a = [ [random.randint(1,500) for _ in range(5)] for _ in range(5)]   # automatic or
a = [ [int(input("Number: ")) for _ in range(5)] for _ in range(5)   # manual input

Доку:

...