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







format