Как бы я мог исправить ошибку 'list index out of range' в этом коде Python? - PullRequest
3 голосов
/ 13 апреля 2019

Я пытаюсь написать функцию, которая сможет проверять симметрию матрицы, которую вводит пользователь.Если матрица симметрична, печатается true.Если нет, выводится false.

def symmetric(mat, N): 
    for i in range(N): 
        for j in range(N): 
            if (mat[i][j] != mat[j][i]): 
                return False
    return True

mat = []
if (symmetric(mat, 3)): 
    print ('true')
else: 
    print ('false')

Проблема началась, когда я добавил mat = [].IndexError: list index out of range отображается после запуска функции.

Я добавил предопределенную матрицу mat = [[1, 2, 3], [2, 5, 4], [3, 4, 7]], и она отлично работает, но мне нужно, чтобы пользователь ввел матрицу

Конечный результат должен выглядеть примерно такк этому

>>> m1 = [[1, 2, 3], [2, 5, 4], [3, 4, 7]]
>>> symmetric(m1)
True

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Что может быть более полезным, это использовать массив numpy .Он позволяет вам использовать атрибут shape, чтобы проверить, является ли матрица квадратной, и тогда вам не нужно вводить размерный размер

import numpy as np 

mat = np.array([[1, 2, 3], [2, 5, 4], [3, 4, 7]])

def symmetric(mat):
    rows, cols = mat.shape
    if rows != cols:
         raise ValueError("Invalid matrix isn't square")

    for i in range(rows):
        for j in range(cols):
            if (mat[i][j] != mat[j][i]): 
                    return False
    return True

try:
    is_symmetric = symmetric(mat)
except ValueError as e:
    print(e)

Numpy - это пакет, который вам понадобится pip install, но это позволяет вам довольно легко превентивно обрабатывать неквадратный регистр.Кроме того, функция allclose может позволить вам быстро проверить симметричную природу массива, как указано в в этом вопросе , или как предложил @Sheldore:

def symmetric(mat):
    if (mat.T == mat).all():
        return True
    return False

mat = np.array([[1, 2, 3], [2, 5, 4], [3, 4, 7]])

Подход с использованием собственного списка

Вы можете использовать подход к пониманию списка в сочетании с операцией all:

def symmetric(mat, N):
    # This is a pretty naive way to check the dimensions in a similar fashion
    # as np.shape, but this gets the thought process across
    row, col = len(mat[0][:]), len(mat[:][0])

    if row != col:
        raise ValueError("Non-square matrix is invalid")

    if all([mat[i][j] == mat[j][i] for i, j in zip(range(row), range(col))]:
        return True
    return False
0 голосов
/ 13 апреля 2019

Вы можете использовать базовые try и except, чтобы поймать это дело.Однако вы должны , а не делать это в обычном коде.Используйте эту функцию для реализации этого:

def symmetric(mat, N):
    try:
        for i in range(N): 
            for j in range(N): 
                if (mat[i][j] != mat[j][i]): 
                    return False
        return True
    except IndexError:
        print('Invalid input.')

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

0 голосов
/ 13 апреля 2019
mat = []
try:
    if (symmetric(mat, 3)): 
        print ('true')
    else: 
        print ('false')
except IndexError:
    print('Invalid matrix, try again')
...