function - une - somme matrice python
problèmes d'erreur et de sortie pour la matrice python? (2)
Je construis une fonction qui prend une liste composée de listes (ex: [['a'],['b'],['c']]
) et la sort comme une table. Je ne peux pas utiliser la jolie table car j'ai besoin d'une sortie spécifique (ex | a | b |
) avec les lignes et les espaces exactement identiques.
Voici ma fonction:
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")
Je continue à recevoir l'erreur:
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
Je ne suis pas sûr pourquoi il y a un problème. J'ai également obtenu une erreur de sortie où il ne sort que le premier élément de la première liste et rien de plus. Quelqu'un pourrait-il expliquer comment utiliser la fonction de format pour se débarrasser de cette erreur et afficher ce que je veux correctement?
Correction d'une erreur mais échec des tests:
FAIL: test_show_table_12 ( principal .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 |
? ++++ + + +
Le problème est ici:
for row in range(table):
range
prend 1, 2 ou 3 entiers comme arguments. Cela ne prend pas de liste.
Vous voulez utiliser:
for row in table:
En outre, vérifiez vos retraits; il semble que l'ajout de la nouvelle ligne devrait être plus en retrait.
Votre traceback vous indique que le problème se produit à la ligne 5:
for row in range(table):
... donc quelque chose sur cette ligne essaie, sans succès, d'interpréter autre chose comme un entier. Si nous regardons les docs de range()
, nous voyons ceci:
Les arguments du constructeur de plage doivent être des entiers (intégrés
int
ou n'importe quel objet qui implémente la méthode spéciale__index__
).
... mais la table
n'est pas un nombre entier; c'est une liste. Si vous voulez parcourir une liste (ou quelque chose de similaire), vous n'avez pas besoin d'une fonction spéciale - simplement
for row in range:
fonctionnera très bien.
Il y a un autre problème avec votre fonction en dehors de la mauvaise utilisation de range()
, qui est que vous avez trop indenté votre code. Ce:
if table is None:
table=[]
new_table=""
for row in range(table):
for val in row:
new_table+= ("| "+val+" ")
new_table+= "|\n"
... n'exécutera que le code indenté si la table
est None
, alors que ce que vous voulez vraiment, c'est simplement de mettre table=[]
si c'est le cas. Fixer ces deux problèmes vous donne ceci:
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")
(J'ai également changé tous vos retraits en quatre espaces, et ajouté des espaces ici et là, pour améliorer le style).