我将如何解决此Python代码中的“列表索引超出范围”错误?

时间:2019-04-13 20:46:17

标签: python matrix symmetry

我正在尝试编写一个函数,该函数将能够检查用户输入的矩阵的对称性。如果矩阵是对称的,则打印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 个答案:

答案 0 :(得分:1)

使用numpy array可能会更有帮助。它允许您利用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函数可让您快速检查数组的对称性质,如this question中所述,或如@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

答案 1 :(得分:0)

mat = []
try:
    if (symmetric(mat, 3)): 
        print ('true')
    else: 
        print ('false')
except IndexError:
    print('Invalid matrix, try again')

答案 2 :(得分:0)

您可以使用基本的tryexcept来解决这种情况。但是,您应该在常规代码中执行此操作。使用您的函数来实现此目的:

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.')

这样,无论调用函数多少次,您都可以忽略用户输入错误的情况。