function - una - error y problemas de salida para la matriz de python?
producto de matrices en python (2)
El problema está aquí:
for row in range(table):
range
toma 1, 2 o 3 enteros como argumentos. No tiene una lista.
Desea usar:
for row in table:
Además, verifique sus sangrías; parece que la adición de nueva línea debe sangrarse más.
Estoy construyendo una función que toma una lista compuesta de listas (por ejemplo: [[''a''],[''b''],[''c'']]
) y la genera como una tabla. No puedo usar la tabla bonita porque necesito una salida específica (ex | a | b |
) con las líneas y los espacios exactamente iguales.
Aquí está mi función:
def show_table(table):
if table is None:
table=[]
new_table=""
for row in range(table):
for val in row:
new_table+= ("| "+val+" ")
new_table+= "|/n"
return new_table.strip("/n")
Sigo recibiendo el error:
show_table([[''a''],[''b''],[''c'']])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in show_table
TypeError: ''list'' object cannot be interpreted as an integer
No estoy seguro de por qué hay un problema. También obtuve un error de salida donde solo muestra el primer elemento en la primera lista y nada más. ¿Podría alguien explicar cómo usar la función de formato para deshacerse de este error y generar lo que quiero de forma correcta?
Se corrigió el error pero aún fallaron las pruebas:
FAIL: test_show_table_12 ( main .AllTests)
Traceback (most recent call last):
File "testerl7.py", line 116, in test_show_table_12
def test_show_table_12 (self): self.assertEqual (show_table([[''10'',''2'',''300''],[''4000'',''50'',''60''],[''7'',''800'',''90000'']]),''| 10 | 2 | 300 |/n| 4000 | 50 | 60 |/n| 7 | 800 | 90000 |/n'')
AssertionError: ''| 10| 2| 300|/n| 4000| 50| 60|/n| 7| 800| 90000|'' != ''| 10 | 2 | 300 |/n| 4000 | 50 | 60 |/n| 7 | 800 | 90000 |/n''
- | 10| 2| 300|
+ | 10 | 2 | 300 |
? +++ +++ +++
- | 4000| 50| 60|
+ | 4000 | 50 | 60 |
? + ++ ++++
- | 7| 800| 90000|+ | 7 | 800 | 90000 |
? ++++ + + +
Su rastreo le dice que el problema ocurre en la línea 5:
for row in range(table):
... así que algo en esa línea está intentando, sin éxito, interpretar algo más como un entero. Si echamos un vistazo a los documentos para range()
, vemos esto:
Los argumentos para el constructor de rango deben ser enteros (ya sea incorporados
int
o cualquier objeto que implemente el método especial__index__
).
... pero la table
no es un número entero; es una lista Si desea iterar sobre una lista (o algo similar), no necesita una función especial, simplemente
for row in range:
funcionará bien
Existe otro problema con su función aparte del mal uso de range()
, que es que ha sangrado demasiado de su código. Esta:
if table is None:
table=[]
new_table=""
for row in range(table):
for val in row:
new_table+= ("| "+val+" ")
new_table+= "|/n"
... solo ejecutará cualquiera de los códigos sangrados si la table
es None
, mientras que lo que realmente desea es simplemente establecer table=[]
si ese es el caso. Reparar ambos problemas te da esto:
def show_table(table):
if table is None:
table=[]
new_table = ""
for row in table:
for val in row:
new_table += ("| " + val + " ")
new_table += "|/n"
return new_table.strip("/n")
(También cambié todas las sangrías a cuatro espacios y agregué espacios aquí y allá para mejorar el estilo).