索引器错误:创建矩阵时,列表索引超出范围

2024-05-15 09:38:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个家庭作业程序,在那里我需要创建一个矩阵,我做了一个函数,用一个数组和一些记录(我以前创建的)作为参数,但是当我创建大量的记录时,例如:100条记录,我得到的列表索引超出了范围

数组创建:

def crearVector(n):
    vec = [None] * n
    for i in range(len(vec)):
        codigo = random.randint(1, 1000)
        precio = round(random.uniform(1, 100000), 2)
        ubicacion = random.randint(1, 23)
        estado = random.randint(0, 1)
        cantidad = random.randint(0, 1000)
        puntuacion = random.randint(1, 5)
        publicacion = Publicacion(codigo, precio, ubicacion, estado, cantidad, puntuacion)
        vec[i] = publicacion
    return vec

数组创建函数调用:

def test():
    n = validateHigherThan(0)
    vec = crearVector(n)

矩阵创建和显示功能:

mat = crearMatriz(vec)
forma = int(input("How would you like to show the matrix?(0: matrix, 1: list): "))
if forma == 1:
    mostrarMatrizLista(mat)
elif forma == 0:
     mostrarMatriz(mat)

矩阵创建:

def crearMatriz(vec):
    mat = [[0] * 5 for i in range(23)]
    for i in range(len(vec)):
        fil = vec[i].ubicacion
        col = vec[i].puntuacion-1
        mat[fil][col] += 1
    return mat

Tags: infordef记录range矩阵random数组
2条回答

我相信你在矩阵上的fil列的ubicacion上缺少了-1。请看下面的代码。定义以0开头的列时要小心

# ubicacion = random.randint(1, 23) (range is 1 to 23)
def crearMatriz(vec):
    mat = [[0] * 5 for i in range(23)]
    for i in range(len(vec)):
        fil = vec[i].ubicacion-1 # <- this -1 is what you were missing, when ubicacion = 23 list goes out of range.
        col = vec[i].puntuacion-1        
        mat[fil][col] += 1
    return mat

另外,我假设你的程序并不需要那么多的易读性,因为它是一个家庭作业,然而,使用一些变量来帮助你定义你的最大范围是很有用的,以帮助你调试,例如

import random

CODIGO_MAX = 1000
PRECIO_MAX = 100000
UBICACION_MAX = 23
ESTADO_MAX = 1
CANTIDAD_MAX = 1000
PUNTUACION_MAX = 5

def crearVector(n):
    vec = [None] * n
    for i in range(len(vec)):
        codigo = random.randint(1, CODIGO_MAX)
        precio = round(random.uniform(1, PRECIO_MAX), 2)
        ubicacion = random.randint(1, UBICACION_MAX)
        estado = random.randint(0, ESTADO_MAX)
        cantidad = random.randint(0, CANTIDAD_MAX)
        puntuacion = random.randint(1, PUNTUACION_MAX)
        publicacion = Publicacion(codigo, precio, ubicacion, estado, cantidad, puntuacion)
        vec[i] = publicacion
    return vec


def crearMatriz(vec):
    mat = [[0] * PUNTUACION_MAX for i in range(UBICACION_MAX)]
    for i in range(len(vec)):
        fil = vec[i].ubicacion-1
        col = vec[i].puntuacion-1
        mat[fil][col] += 1
    return mat



crearMatriz(crearVector(1000))

你创建了一个23*5的矩阵

fil = vec[i].ubicacion

应该是

fil = vec[i].ubicacion-1

因为ubicacion可以有从1到23的随机数。你知道吗

更好的是,您可以使用全局变量来定义这些参数,而不是在两个函数中硬编码它们。你知道吗

col_limit = 5
fil_limit = 23
def crearVector(n):
    vec = [None] * n
    for i in range(len(vec)):
        codigo = random.randint(1, 1000)
        precio = round(random.uniform(1, 100000), 2)
        ubicacion = random.randint(1, fil_limit)
        estado = random.randint(0, 1)
        cantidad = random.randint(0, 1000)
        puntuacion = random.randint(1, col_limit)
        vec[i] = Publicacion(codigo, precio, ubicacion, estado, cantidad, puntuacion)
    return vec

def crearMatriz(vec):
    mat = [[0] * col_limit for i in range(fil_limit)]
    for i in range(len(vec)):
        fil = vec[i].ubicacion - 1
        col = vec[i].puntuacion- 1
        mat[fil][col] += 1
    return mat

相关问题 更多 >