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

import numpy as np
def diag_2k(a):
    a = []
    diag = []
    s = 0
    for i in a:
        diag.append(a[i,i])
        for j in range(len(diag)):
            if diag[j] % 2 == 0:
                s += diag[j]
    result = s
    return result

что не так?


Ответы (2 шт):

Автор решения: MaxU

если вы импортируете модуль Numpy, то есть смысл воспользоваться его векторизированными методами.

Пример:

создаем матрицу из случайных чисел:

In [26]: np.random.seed(31415)

In [27]: a = np.random.randint(10, size=(10, 8))

In [28]: a
Out[28]:
array([[7, 3, 5, 8, 2, 6, 6, 3],
       [5, 6, 0, 0, 8, 3, 6, 1],
       [6, 8, 5, 1, 4, 6, 9, 2],
       [7, 2, 2, 3, 3, 9, 8, 3],
       [4, 8, 3, 8, 2, 0, 0, 4],
       [4, 7, 2, 6, 6, 0, 2, 6],
       [6, 1, 9, 1, 4, 2, 2, 8],
       [0, 7, 5, 4, 8, 3, 8, 3],
       [8, 5, 7, 7, 1, 4, 5, 7],
       [6, 4, 4, 6, 4, 2, 5, 5]])

создаём вектор, состоящий из диагональных элементов:

In [29]: diag = np.diagonal(a)

In [30]: diag
Out[30]: array([7, 6, 5, 3, 2, 0, 2, 3])

суммируем четные элементы вектора:

In [31]: res = diag[diag % 2 == 0].sum()

результат:

In [32]: res
Out[32]: 10
→ Ссылка
Автор решения: nomnoms12

"Vanilla" Python:

def f(matrix) -> int:
    n = min(len(matrix), len(matrix[0]))

    s = 0
    for i in range(n):
        if (x := matrix[i][i]) % 2 == 0:
            s += x
    return s


def main():
    matrix = [
        [3, 1, 1, 1],
        [1, 2, 1, 1],
        [1, 1, 3, 1],
        [1, 1, 1, 4],
        [1, 1, 1, 1],
    ]
    print(f(matrix))


if __name__ == '__main__':
    main()

stdout:

6
→ Ссылка