2015-10-15 5 views
0

Поскольку я изучал python, я столкнулся с проблемой и не смог определить, что пошло не так. Пожалуйста, ознакомьтесь с приведенным ниже кодом python.Идентификационная матрица

def is_identity_matrix(matrix): 
    n = len(matrix) 
    if n != len(matrix[0]): 
     return False 
    i = 0 
    while i < n: 
     j = 0 
     while j < n: 
      if matrix[i][j] == matrix[i][i]: 
       if matrix[i][j] != 1: 
        return False 
      else: 
       if matrix[i][j] != 0: 
        return False 
      j+=1 
     i+=1 
    return True 

matrix6 = [[1,0,0,0], 
      [0,1,0,1], 
      [0,0,1,0], 
      [0,0,0,1]] 

print is_identity_matrix(matrix6) 

Это выводит True вместо False как вопрос просит нас, чтобы проверить на единичную матрицу, где только диагональная линия в середине должна быть 1, остальные должны быть равны 0. Поскольку matrix[1][3] не равен 1 , выход должен быть ложным. Может ли кто-нибудь помочь? Спасибо огромное!

+5

не должен быть вашей 'if matrix [i] [j] == matrix [i] [i]:' be 'if i == j:'? и 'для i в диапазоне (n):' более pythonic, чем вариант 'while' ... –

+0

получил его. Это освещает. Спасибо! – zero

ответ

2

вы должны сравнить i == j вместо matrix[i][j] == matrix[i][i].

и здесь версия с использованием for вместо while.

def is_identity_matrix(matrix): 
    n = len(matrix) 
    if n != len(matrix[0]): 
     return False 
    for i in range(n): 
     for j in range(n): 
      if i == j: 
       if matrix[i][j] != 1: 
        return False 
      else: 
       if matrix[i][j] != 0: 
        return False 
    return True 

или даже (с помощью product из itertools), который сохраняет отступ и выглядит еще более читаемым мне:

from itertools import product 

def is_identity_matrix(matrix): 
    n = len(matrix) 
    if n != len(matrix[0]): 
     return False 
    for i, j in product(range(n), range(n)): 
     if i == j: 
      if matrix[i][j] != 1: 
       return False 
     else: 
      if matrix[i][j] != 0: 
       return False 
    return True 
+0

В этом случае '[i]' и '[j]' будут автоматически увеличиваться из-за каждого запуска 'for'? – zero

+0

'i' (и' j', соответственно) будут перебирать все целые числа от '0' до' n-1' - это делает именно то, что сделала ваша конструкция 'while'. он просто более компактен и чувствует себя намного более естественным для меня. вы можете даже больше его компактифицировать и использовать 'for i, j в продукте (диапазон (n), range (n)):' (вам придется сначала «из itertools import product»). –

+0

Спасибо, что показали мне это. Я тоже начал читать «диапазон()». Благодаря! – zero

3

Как Хиро герой сказал, что проблема в линии:

if matrix[i][j] == matrix[i][i]: 

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

Линия следует читать:

if i == j: 
+0

Получил это. Спасибо! – zero

0

, если вы не узнали диапазон(), так же, как мне сейчас, вот мое решение:

def is_identity_matrix(matrix): 
    #Write your code here 
    n=len(matrix) 
    if n==len(matrix[0]): 
     i=0 
     while i<n: 
      j=0 
      while j<n: 
       if j==i: 
        if matrix[i][j]!=1: 
         return False 
       else: 
        if matrix[i][j]!=0 or matrix[j][i]!=0: 
         return False 
       j=j+1 
      i=i+1 
     else: 
      return True 
    else: 
     return False 
Смежные вопросы