2016-08-25 2 views
-3
def antisymmetric(A): 
    #Write your code here 
    for i in range(3): 
     for j in range(3): 
      if A[i][j] == -A[j][i]: 
       return True 
      else: 
       return False  


# Test Cases: 

print antisymmetric([[0, 1, 2], 
        [-1, 0, -2], 
        [2, 2, 3]]) 
#>>> False 

Удивительно, что приведенный выше тестовый пример верен True для этого кодирования python 2.7, может ли кто-нибудь сказать мне причину?Почему этот тестовый пример python-2.7 True?

+0

Потому что первая вещь 0. – muddyfish

+2

0 == -0 и мир работает как ожидалось. –

+0

A [0] [0] == -A [0] [0], потому что A [0] [0] == 0 – tianwei

ответ

1

Вы возвращаетесь Правда при г = 0 у = 0 цикл не выполняется не до конца

1

Я предполагаю, что это происходит потому, что вы вернетесь из функции после первого теста. Возможно, вы захотите вернуться только после того, как вы можете исключить возможность того, что матрица является антисимметричной. То есть. onley возвращает false в цикле и возвращает true после прокрутки циклов.

+0

Вы должны указать свой ответ с большей уверенностью! Не говорите «я думаю» и «возможно». И используйте проверку орфографии. :) –

3

Он возвращается Правда при I = 0 и J = 0

Модифицированный раствор:

def antisymmetric(A): 
    for i in range(3): 
     for j in range(3): 
      if A[i][j] != -A[j][i]: 
       return False 
    return True 
2

Ваш тест возвращается сразу после первой проверки. Чтобы проверить, является ли матрица антисимметричной (кососимметричной), вам нужно продолжать проверку, пока не найдете пару (i, j) с A[i][j] != -A[j][i].

В Python почти всегда лучше контактировать элементы в контейнерах, а не использовать индексы. Для того, чтобы транспонировать матрицу можно использовать встроенную в zip функцию:

def is_antisymmetric(m): 
    # Transpose matrix m 
    t = zip(*m) 

    #Check each row against each column 
    for row, col in zip(m, t): 
     #Test that each item in the row is the negative 
     # of the corresponding column item 
     for u, v in zip(row, col): 
      if u != -v: 
       return False 
    return True 

# Test 

data = (
    # Not anti-symmetric 
    [[0, 1, 2], 
    [-1, 0, -2], 
    [2, 2, 3]], 

    # Anti-symmetric 
    [[0, 1, 2], 
    [-1, 0, -2], 
    [-2, 2, 0]], 
) 

for m in data: 
    for row in m: 
     print(row) 
    print(is_antisymmetric(m)) 

выход

[0, 1, 2] 
[-1, 0, -2] 
[2, 2, 3] 
False 
[0, 1, 2] 
[-1, 0, -2] 
[-2, 2, 0] 
True 

Мы можем сделать функцию гораздо более компактным, используя выражение генератора внутри функции all:

def is_antisymmetric(m): 
    return all([-u for u in col] == row for row, col in zip(m, zip(*m))) 

Функция all прекращает тестирование, как только находит ow, который не равен соответствующему столбцу. И тест == также останавливает сравнение текущей строки с текущим столбцом, как только он обнаружит несоответствие, поэтому этот код эквивалентен более ранней версии, за исключением того, что он немного эффективнее. Однако, это может быть не так легко читать, если вы не используете генератор выражений. :)

FWIW, весь код в этом ответе работает на Python 2 и Python 3 и обрабатывает квадратные матрицы любого размера.

Смежные вопросы