Необходимо написать функцию которая создает квадратичную единичную матрицу, не применяя библиотеку NumPy

def build_array(n):
    m = [[for i in range(n)] for j in range(n)]
    m[i][i] = 1
    
    return m

Выдает ошибку по синтаксису. В чем ошибка, не могу понять?


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

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

Попробуйте так:

def build_array(n):
    return [[1 for _ in range(n)] for __ in range(n)]

Если нужна единичная матрица:

def build_array(n):
    return [[int(i==j) for i in range(n)] for j in range(n)]
→ Ссылка
Автор решения: TigerTV.ru

Ваша ошибка заключается в том, что вы не указали функцию присвоения элемента для [for i in range(n)], т.е. должна быть форма [f(i) for i in range(n)], f(i) - функция присвоения зависящая от i.

Говоря другими словами, данный код:

m = [f(i) for i in range(n)]

эквивалентен cледующему коду(ведет себя аналогично):

m = []
for i in range(n):
    m.append(f(i))

Более подробно читайте официальную документацию.

Можно инициализировать таблицу нулями, а затем установить единицы по диагонали(это если вам нужна единичная матрица, а не матрица заполненная единицами), но проще решить задачу следующим образом:

def build_array(n):
    return [[int(i==j) for i in range(n)] for j in range(n)]
→ Ссылка
Автор решения: eri

Ещё один вариант:

m = ((1,) * n,) * n
→ Ссылка
Автор решения: Alex Alex

Вот самая настоящая единичная матрица, аналог np.eye() (не путать с матрицей состоящей из единиц np.ones()):

def build_array(n):
    return [[1 if i==j else 0 for j in range(n)] for i in range(n)]
→ Ссылка
Автор решения: Danis

list comprehension должен быть такого вида

[i for i in range(n)]

а у вас просто

[for i in range(n)]

поэтому и происходит ошибка

Чтобы единицы стояли под догнали место перед for допишите 1 if i == j else 0

[[1 if i == j else 0 for i in range(n)] for j in range(n)] 
→ Ссылка