Foire aux questions du Module 6

FAQ générale du Module 6

Cette section comprend les questions posées et réponses au sujet de la matière abordée dans le module 6 du cours.

UpyLaB du Module 6

UpyLaB 6.1

MICHELLE

Bonjour,

Bonsoir, bizarrement Upylab m’indique que ma fonction est correcte alors que je ne retourne pas les prénoms dans l’ordre attendu…mieux vaut ça que l’inverse :D Un petit conseil en passant pour les ordonner dans l’ordre attendu ? Merci.

Réponse de l’équipe

Bonjour Michelle,

Ce que la fonction doit retourner est un ensemble. Il n’y a pas de notion d’ordre dans un ensemble Python, et donc l’ordre dans lequel les prénoms apparaissent sera tout à fait quelconque.

GEORGES

Bonjour,

Mon code me permet bien de trouver les prénoms attendus mais je n’arrive pas à trouver un moyen de les conserver en entier : l’ensemble que j’obtiens en retour contient seulement les lettres. J’imagine que quelque chose m’échappe à propos de ces ensembles, mais peut-être est-ce plutôt lié au code ?

Réponse de l’équipe

Bonjour Georges,

Je pense que c’est parce que tu utilises la méthode update, qui va ajouter tout le contenu d’un ensemble à ton ensemble, et non un seul élément. Essaie avec add plutôt.

ANAÏS

Bonjour,

Peut-on faire une fonction avec une seule instruction ? Merci.

Réponse de l’équipe

Bonjour Anaïs,

un return d’un ensemble créé par compréhension est possible. Donc :

return { ... }

Réponse d’Anaïs

J’ai essayé de nombreuses combinaison mais ça retourne ou {none} ou {none,none,none,none,none}. Je ne comprends pas ! Même avec pythontutor. Merci.

Réponse de l’équipe

La méthode add retourne None. Si tu utilises une compréhension, il ne faut pas utiliser cette méthode mais écrire directement l’élément que tu veux ajouter à ton ensemble. Par exemple, les deux scripts suivants sont équivalents :

mon_set = set()
for i in range(5):
   mon_set.add(i)
print(mon_set)

mon_set = {i for i in range(5)}
print(mon_set)

Bon courage !

UpyLaB 6.3

MATHILDE

Bonjour,

Je n’arrive pas à avoir le bon ordre final des candidats, j’ai d’abord trié le dictionnaire selon les moyennes et après, isolé les 3 meilleurs pour recréer un dictionnaire et ensuite afficher les clés mais j’obtiens tout de même un mauvais ordre à la fin.

Réponse de l’équipe

Bonjour Mathilde,

Les ensembles et les dictionnaires ne respectent pas l’ordre des éléments. Surtout avec Python 3.5.3 utilisé par UpyLaB. Si tu souhaites conserver l’ordre, il faut plutôt utiliser une liste ou un tuple. Bon courage !

SIMON

Bonjour,

L’exercice résolu donne les bons résultats dans PyCharm ainsi que dans Python Tutor. Les résultats attendus par le correcteur sont identiques aux miens. Que faire ?

Réponse de l’équipe

Bonjour Simon,

Le souci est que ton code donnera, ou pas, la bonne solution, selon le système et la version de Python. En effet, avant Python 3.7, il n’y a aucune notion d’ordre dans un dictionnaire. Lorsque l’on demande à Python d’afficher un dictionnaire, ou d’itérer sur ses éléments, ceux-ci vont apparaître dans n’importe quel ordre.

Et donc, même si tu as entré les couples clés valeurs dans l’ordre souhaité, lorsque ensuite tu demandes à Python d’en faire une liste des clés, et bien cette liste comporte les clés du dictionnaire, mais dans n’importe quel ordre. Et forcément les trois premières ne seront pas forcément celles que l’on souhaite.

L’idée est donc de trier les données non pas au moment de créer le dictionnaire, mais au moment d’en faire une liste.

Bon débogage !

ALEXANDRE

Bonjour,

Pourquoi l’instruction (i for i in range(5)) construit un générateur et pas un tuple par compréhension ? Est-ce à dire que seul les listes sont constructible par compréhension?

Merci.

Réponse de l’équipe

Bonjour Alexandre,

Pour obtenir un tuple, il faut transformer ce générateur en utilisant la fonction tuple :

tuple(i for i in range(5))

En fait, un tuple est caractérisé non pas par les parenthèses, mais par les virgules. Il ne suffit pas de mettre une expression entre parenthèses pour en faire un tuple. Essaie :

a = (42)
print(type(a))
a = 42,
print(type(a))

UpyLaB 6.5

YASMINA

Bonjour,

Mon code modifie uniquement la dernière valeur : inf en infinity. Comment faire ?

Réponse de l’équipe

Bonjour Yasmina,

C’est effectivement le cas, puisque tu repars du texte initial à chaque itération. Il te faut récupérer le résultat après une transformation, puis appliquer la transformation suivante à ce résultat et non au texte de départ.

Bon courage !

ALAIN

Bonjour,

Anaconda me dit que tout fonctionne en tout cas pour l’exemple de Chuck ! Mais pas Upylab « Norriss-ez » moi d’une explication s’il vous plaît. Merci d’avance.

Réponse d’Alain

En réfléchissant, je crois que mon script rajoute un espace après le dernier mot. Je vais donc devoir changer d’approche.

Réponse de l’équipe

Ou, si c’est bien un souci d’espace finale superflue, utiliser la méthode strip sur la chaîne que tu retournes.

Réponse d’Alain

C’était bien ça ! Merci de l’aide.

DIDIER

Bonjour,

Je ne comprends pas du tout pourquoi mon code ne fonctionne pas sur le dernier test de UpyLab. Pourtant ça marche sur Python Tutor et les autres tests. Un mystère pour moi. Est-ce que la même chose vous est arrivée ? Merci beaucoup.

Réponse de l’équipe

Le souci va se poser si l’abréviation “c” est substituée en premier. Car alors la sous-chaîne “mm” de “commissaires” va elle aussi être substituée.

Et comme on ne sait pas dans quel ordre on obtient les items d’un dictionnaire lorsqu’on itère dessus, il va falloir être un petit peu plus précautionneux.

Bon courage !

UpyLaB 6.5

CLÉMENTINE

Bonjour,

J’avais mis dans mon code que si prenom2 n’était pas dans le dictionnaire, sa valeur serait égale à s que j’avais déclaré comme s = set(). Mon code n’a pas été validé et je l’ai changé en écrivant directement prenom2 = set() et mon code était bon.

Je ne comprends pas pourquoi mon code n’était pas exact en initialisant s. Merci pour votre explication.

Réponse de l’équipe

Bonjour Clémentine,

Dans le premier cas, toutes les valeurs sont égales au même ensemble. Et ainsi, toute modification apportée à cet ensemble sera répercutée pour toutes les clés du dictionnaire.

UpyLaB 6.6

ÉRIC

Bonjour,

Petit souci : si je veux retirer proprement le nom d’un des amis avec un d[prenom1].remove[prenom2] j’ai droit à un message du type :

"RuntimeError: Set changed size during iteration"

Comment pallier ce problème ?

Réponse de l’équipe

Bonjour Éric,

Effectivement, on ne peut pas modifier une séquence sur laquelle on itère. Il te faut donc itérer sur autre chose : une copie peut-être, non ?

Réponse d’Éric

Effectivement ça fonctionne. Merci.

SOPHIE

Bonjour,

Pour cet exercice j’ai l’impression qu’il faut obligatoirement faire appel à la fonction deepcopy() du module copy.

Réponse de l’équipe

Bonjour Sophie,

Non, le deepcopy n’est pas nécessaire. On peut résoudre l’exercice en utilisant la fonction prédéfinie copy(). Si vous voulez faire une copie du dictionnaire d’amis, comme les valeurs associées sont des ensembles alors oui il faudrait utiliser deepcopy() ; mais si vous ne faites que copier les amis d’une personne c’est-à-dire un ensemble de chaînes de caractères, alors la copy() suffit.

UpyLaB 6.7

PAULINE

Bonjour,

Je suis bloquée sur cet exercice. J’ai cette erreur :

"Votre programme a été interrompu par une exception:
Ligne 28: TypeError: 'list' object cannot be interpreted as an integer"

Et mon code fonctionne sans souci avec IDLE. Est-ce que quelqu’un a rencontré ce problème ?

Réponse de l’équipe

Bonjour Pauline,

Dans cet exercice, il faut coder 3 fonctions. Mais attention les paramètres en entrée de even et prime_numbers ne sont pas du même type que celui de la fonction prime_odd_numbers : les premières attendent des int quand la troisième une list.

LUC

Bonjour,

Concernant cet exercice, je ne vois pas comment les fonctions even et prime_numbers interviennent dans notre code puisqu’on veut tester pour chaque élément de la liste en entrée si c’est un nombre premier et si c’est un nombre impair (si j’ai bien compris ?).

Réponse de l’équipe

Bonjour Luc,

On pourrait bien sûr réaliser la fonction principale demandée prime_odd_numbers sans ces deux autres fonctions, mais il s’agit ici de s’exercer à manipuler fonctions et ensembles.

UpyLaB 6.8

VICTOR

Bonjour,

Voici mon appel de fonction dans PyCharm :

store_email(['ludo@prof.ur', 'andre.colon@stud.ulb', 'thierry@profs.ulb', 'sébastien@prof.ur', 'eric.ramzi@stud.ur', 'bernard@profs.ulb', 'jean@profs.ulb'])

voici ma sortie toujours dans PyCharm :

{'prof.ur': ['ludo', 'sébastien'], 'stud.ulb': ['andre.colon'], 'profs.ulb': ['thierry', 'bernard', 'jean'], 'stud.ur': ['eric.ramzi']}

et voici le résultat attendu par UpyLaB :

{'profs.ulb': ['bernard', 'jean', 'thierry'], 'stud.ulb': ['andre.colon'], 'stud.ur': ['eric.ramzi'], 'prof.ur': ['ludo', 'sébastien']}

Où est la différence ? Merci beaucoup.

Réponse de l’équipe

Bonjour Victor,

Les listes doivent être triées par ordre alphabétique.

UpyLaB 6.9

SAMANTHA

Bonjour,

J’ai un petit souci avec l’énoncé de cet exercice. La réponse attendue par Upylab ne correspond pas à l’énoncé de l’exercice. En réalité la réponse attendue n’est pas un dictionnaire avec des clés dans l’ordre alphabétique comme dans l’exemple fourni mais avec des clés dans un ordre étrange donc un dictionnaire différent de la réponse demandée. Que faire ? Merci pour votre réponse.

Réponse de l’équipe

Bonjour Samantha,

Il n’y a pas de notion d’ordre dans un dictionnaire. Ainsi, quand on demande à Python d’afficher un dictionnaire, les couples clés/valeurs peuvent apparaître dans n’importe quel ordre.

Dans les trois tests effectués, il est bien retourné un dictionnaire de 26 couples clés/valeurs, ce qui correspond à la consigne.

JULES

Bonjour,

ma fonction semble bien tourner sur PyCharm comme sur Python Tutor pourtant UpyLaB me renvoie une erreur :

TypeError: isinstance() arg2 must be a type or tuple of types.

Pouvez-vous m’aider à déboguer ?

Réponse de l’équipe

Bonjour Jules,

Je pense que le souci vient du fait que tu as appelé une variable globale dict alors que cet identifiant est déjà celui d’un type en Python. Ainsi, lorsqu’UpyLaB cherche à vérifier que ta fonction retourne bien un dictionnaire, son appel à isinstance(retour de la fonction , dict) pose problème car alors dict désigne ta variable globale (alors que la fonction isinstance attend un type).

Il faut donc faire attention au choix des noms de variables. Par ailleurs, il n’est pas recommandé d’utiliser une variable globale. Pourquoi ne définis-tu pas ton dictionnaire à l’intérieur de la fonction ?

UpyLaB 6.10

LÉA

Bonjour,

Mon code marche sur plusieurs essais sauf :

""fail Votre programme a été interrompu par une exception: Ligne 28 : TypeError: unhashable type: 'list' ""

Réponse de l’équipe

Bonjour Léa,

Il y a un souci avec ton code, car tu essaies à un moment de créer une entrée d’un dictionnaire en utilisant une liste comme clé. Cela n’est pas possible ; les clés des dictionnaires doivent être des objets immuables (nombres, chaînes de caractères, tuples…).

Bon débogage !

MATTHIEU

Bonjour,

J’ai un souci à valider mon code alors que celui-ci semble correct pour les tests d’UpyLab avec Pycharm.

Réponse de l’équipe

Bonjour Matthieu,

Le souci est qu’il n’y a pas de notion d’ordre dans un dictionnaire. Ainsi, même si tu crées le dictionnaire en y insérant les entrées dans un certain ordre, lorsque tu accèdes ensuite à celui-ci (pour l’afficher ou itérer dessus), les couples clés/valeurs vont apparaître dans un ordre qui pourra être différent. Tu ne le constates pas avec PyCharm car ce comportement a été modifié depuis la version 3.7 de Python.

Tu n’es vraiment pas loin de la solution lorsque tu as trié les items de ton dictionnaire. Le souci, c’est qu’il ne faut pas ensuite convertir cela en dictionnaire, car tu perds alors le travail de tri que tu viens de faire. Est-ce que tu ne pourrais pas récupérer la liste des valeurs dès le moment où tu tries les clés ?

Bon courage !

UpyLaB 6.11

MARTIN

Bonjour,

La formule de la surface d’une sphère de rayon « r » indiquée dans l’énoncé (pi * r²) est fausse. La vraie formule est 4 * pi * r². Et malheureusement le robot vérificateur utilise la mauvaise formule pour ses tests.

Réponse de l’équipe

Bonjour Martin,

Ici, il ne s’agit pas du rayon mais du diamètre. Et donc la formule pi*D² est correcte car équivalente à 4*pi*R², puisque le diamètre est égal à 2 fois le rayon.

UpyLaB 6.12

PAULINE

Bonsoir,

Pour cet exercice, il y a bien un mot par ligne dans le fichier, et on peut supposer que tous les mots sont bien écrits en minuscules comme ceux passés à la fonction ? Car UpyLaB me refuse la validation.

Réponse de l’équipe

Bonsoir Pauline,

Il y a bien un mot par ligne. Mais as-tu pensé au retour à la ligne : n à la fin de chaque ligne et qu’il faut retirer par un strip() par exemple ?

Réponse de Pauline

Merci c’était bien ça le souci.

ARNAUD

Bonjour,

Je ne vois pas ce qu’il faut que j’ajoute et comment l’ajouter pour que mon code ne me retourne pas une mauvaise réponse si le mot ne fais pas partie du fichier. En effet, avec les exemples de l’exo, j’ai tout bon sur PyCharm, mais UpyLaB ne me valide pas le code à cause du mot 'pri' qui ne fait pas partie du texte et pour lequel mon code renvoie True. Sur PyCharm j’ai aussi True avec le mot 'pri' alors que ça devrait être False. Que manque t’il à mon code pour éviter ce type de mauvaise réponse ?

Réponse de l’équipe

Bonjour Arnaud,

Certainement que tu cherches à vérifier si le mot est présent dans la ligne, alors qu’il faudrait que tu regardes s’il est exactement égal à elle. "isa" in "isabelle" retourne True, mais ici, ce n’est pas exactement ce qu’on veut.

Bon courage !

Réponse d’Arnaud

Merci pour la réponse. J’ai modifié le test in pour un test d’égalité, mais j’obtiens toujours False ?

Réponse de l’équipe

Tu es sur la bonne voie, mais le souci, c’est que la ligne comporte aussi le caractère final de retour à la ligne, ce qui fait échouer ton test. Il faut donc simplement éliminer ce caractère avant de faire la comparaison (== fera parfaitement l’affaire, pas besoin de tester la longueur). Tu peux utiliser un slice, ou une méthode sur les chaînes de caractères que je te laisse trouver dans l’aide-mémoire.

JULIE

Bonjour,

mon code a l’air de fonctionner dans UpyLaB sauf pour un cas. Est-ce que vous pourriez m’indiquez si quelque chose cloche dans ma fonction ?

Réponse de l’équipe

Bonjour Julie,

Si tu écris for line in f, line va valoir successivement chacune des lignes du fichier. Il ne faut donc pas appeler la méthode readline ensuite, qui va « consommer » une ligne du fichier à chaque appel.

UpyLaB 6.13

ARTHUR

Bonjour,

J’ai un souci _out of range_ que je n’arrive pas à comprendre. Ça semble venir de mon test :

if liste[index] == liste[index+1]:

Réponse de l’équipe

Bonjour ARTHUR,

Si ta variable index parcourt range(len(liste)) alors quand index aura la dernière valeur, tu auras un souci avec index+1, non ?

Réponse de ARTHUR

Mais oui bien sûr. Merci.

STEPHANIE

Bonjour,

Ma fonction next_line renvoie les bons résultats dans PyCharm mais pourtant rien n’est validé dans UpyLaB. Par exemple :

>>> next_line([2, 1, 3, 3, 2, 1])
['1', '2', '1', '1', '2', '3', '1', '2', '1', '1']

Réponse de l’équipe

Bonjour STEPHANIE,

Attention au type des éléments : ['1', '2', '1', '1', '2', '3', '1', '2', '1', '1'] n’est pas [1, 2, 1, 1, 2, 3, 1, 2, 1, 1]

TOM

Bonjour,

Mon code est ok dans PyCharm (bons resultats). Sur UpyLaB, tout est ok sauf le 2eme test :

Ligne 51: IndexError: list index out of range

Réponse de l’équipe

Bonjour TOM,

As-tu testé next_line([]) ? Souvent ce cas particulier est oublié ou non traité correctement.

Réponse de TOM

Effectivement, j’étais dans le deuxième cas : je le traitais mais ma fonction retournait [1, []] au lieu de [1]. C’est corrigé, merci.

UpyLaB 6.14

GUY

Bonjour,

Le programme semble marcher, mais je reçois dans quelques cas la réponse suivante :

    Votre programme a été interrompu par une exception:
    Ligne 51: IndexError: list index out of range

Mais je ne sais pas par quelle grille un probleme d'index est détecté.
Merci.

Réponse de l’équipe

Bonjour Guy,

Si tu utilises des indices pour accéder aux éléments d’une liste, il faut s’assurer que ceux-ci sont bien compris dans la plage d’indice. Que se passe-t-il pour ta variable indice si toute une ligne est remplie de “V” ?

Réponse de Guy

Merci !! Comment est-il possible que cet erreur grossière ne soit pas identifiée quand je travaille en PyCharm ?

Réponse de l’équipe

Avais-tu seulement testé un pareil cas ?

MARIE-LAURE

Bonjour,

J’obtiens l’erreur suivante lors de la validation de cet exercice :

    Votre programme a été interrompu par une exception:
    Ligne 51: IndexError: list index out of range

Pourriez-vous m'aider ? Merci beaucoup par avance !

Réponse de l’équipe

Bonjour Marie-Laure,

Cette erreur indique un souci au niveau des indices. Vérifie donc que tu ne cherches pas à accéder à une case située en dehors de la matrice. Fais en particulier attention à l’utilisation d’éventuels indices du type i + 1, ou i - 1.

En particulier ici, grille est une liste de listes. On accède à une composante grâce à deux indices x et y : grille[x][y] Il y a 6 lignes, donc l’indice x doit varier entre 0 et 5. Il y a 7 colonnes, donc l’indice y doit varier entre 0 et 6.

Bon débogage !

UpyLaB 6.15

STÉPHANE

Bonjour,

J’obtiens l’erreur suivante lors de la validation de cet exercice :

    Votre programme a été interrompu par une exception:
    Ligne 51: IndexError: list index out of range

Quelqu'un pourrait-il m'éclairer? Merci.

Réponse de l’équipe

Le problème se situe certainement lorsque tu essaies d’accéder aux cellules dont les indices sont lig + 1 (que se passe-t-il quand lig vaut 6 ?). Peut-être devrais-tu ajouter un test sur ton indice avant pour savoir si cela est légitime : if lig < 6 and...

Par ailleurs, le problème pourrait se poser aussi avec les indices col - 1 ou lig - 1 lorsque col ou lig sont égales à 0. Dans ce cas-là, pas d’erreur Out of range, car l’indice -1 existe, mais je ne suis pas sûre que cela donne les résultats escomptés alors.

Bon débogage !

JEAN-LUC

Bonjour,

Certains de vos tests semblent faux sur cet UpyLaB. En effet, voilà ce qui m’est retourné pour l’un d’entre eux :

Résultat attendu pour gagnant([['J', 'R', 'J', 'J', 'J', 'R', 'R'], ['V', 'V', 'R', 'J', 'V', 'V', 'V'], ['V', 'V', 'V', 'V', 'V', 'V', 'V'], ['V', 'V', 'V', 'V', 'V', 'V', 'V'], ['V', 'V', 'V', 'V', 'V', 'V', 'V'], ['V', 'V', 'V', 'V', 'V', 'V', 'V']]) : None

Or le résultat attendu devrait être “J” car il y a 4 “J” sur la première ligne.

Réponse de l’équipe

Bonjour Jean-Luc,

Il faut que les quatre pions de la même couleur soient adjacents en plus d’être sur la même ligne, la même colonne ou la même diagonale.

UpyLaB 6.16

ASTRID

Bonjour,

Ma version de words_by_length donne un retour correct me semble-t-il. L’ordre des clefs et des valeurs est évidemment aléatoire, les dictionnaires sont non ordonnés (dixit le MOOC). C’est l’ordre qui fait problème dans UpyLaB ? Merci.

Réponse de l’équipe

Bonjour Astrid,

Je pense que tu as oublié une partie de la consigne. Même si les couples clés/valeurs sont donnés dans un ordre quelconque, les listes qui correspondent aux valeurs du dictionnaire doivent elles être triées.

Bon courage !

CLAUDE

Bonsoir,

Je n’arrive pas à faire mon tri final dans le deuxième exercice.``sorted(d.items())`` génère des couples,c e qui n’est pas le résultat demandé. Un peu d’aide me serait bien utile. Merci.

Réponse de l’équipe

Bonsoir Claude,

Ce que l’on doit trier, ce n’est pas le dictionnaire, mais les listes qui sont associés aux clés.

Bon courage !

UpyLaB 6.17

FABRICE

Bonjour,

Je comprends qu’il faut décomposer la grille en 9 sous matrices mais je n’arrive pas à le faire en manipulant les index comme je l’ai fait dans les 2 autres fonctions précédentes. Il doit y avoir une petite formule pour se déplacer de trois en trois à insérer dans une boucle for, peut-être avec un %3 bien placé mais je ne trouve pas le truc. Un conseil serait le bienvenu.

Merci

Réponse de l’équipe

Bonjour Fabrice,

Peut-être plutôt avec l’opérateur // ? La première région est formée des lignes et colonnes pour lesquelles le quotient de l’indice par 3 est égal à 0. Pour la deuxième région, le quotient de l’indice de la ligne par 3 doit encore être égal à 0, mais celui de l’indice de la colonne à 1. Etc…

Bon courage !

SONIA

Bonjour,

Est-il possible d’avoir une piste de réflexion concernant l’interruption d’une boucle dès qu’une condition n’est pas remplie ? Je n’arrive vraiment pas à trouver. Peut-on faire en sorte par exemple que la fonction présume une réponse True et dès qu’une des conditions n’est pas remplie, elle renvoie False et s’interrompe ?

Réponse de l’équipe

Bonjour Sonia,

Une boucle while va s’arrêter dès lors que sa condition de continuation devient fausse. Tu peux donc envisager d’utiliser une variable « flag », dont la valeur est initialement égale à True :

flag = True
while flag :
   instructions
   if ... :
        flag = False  #met fin à la boucle
return ...

Bon courage !

UpyLaB 6.18

MATHILDE

Bonjour,

La fonction naked_single ne nécessite-t-elle pas de connaitre la récursivité ?

Réponse de l’équipe

Bonjour Mathilde,

Non. Certains ici ont effectivement utilisé la récursivité pour quelques unes des fonctions des exercices. Mais cette technique de programmation ne fait pas partie des apprentissages de ce MOOC et toutes les fonctions, y compris naked_single, peuvent se coder sans récursivité.

UpyLaB 6.19

PASCAL

Bonjour,

Lorsque je crée la map, tout fonctionne chez moi avec PyCharm mais j’ai une erreur avec UpyLaB. Pourtant ma méthode semble bonne, je commence par choisir aléatoirement deux entiers en 0 et size-1 en utilisant :

x, y = random.randint(0, size), random.randint(0, size)

Réponse de l’équipe

Bonjour Pascal,

Attention la fonction randint, contrairement à la la fonction range inclut son deuxième argument dans l’intervalle. Donc pour choisir entre 0 et size-1 il faut utiliser :

random.randint(0, size-1)

LUCIE

Bonjour,

Avec ma fonction play_game, j’obtiens des KeyError et je ne sais pas pourquoi car j’ai bien créé la map de size x size.

Réponse de l’équipe

Attention dans cette fonction, le dictionnaire ne contient que les cases contenant quelque chose, un piège ou le trésor. Les cases vides n’y figurent pas.

Réponse de Lucie

Ah il faut donc tester l’existence de la clé avant. Merci.

UpyLaB 6.20

ÉMILIE

Bonjour,

Je ne comprends pourquoi l’intitulé « 3.12. Carre de “X” » se retrouve en fin d’impression alors que c’est le seul exo ayant des notes < 10 donc des apprenants fiables. Je pense que la consigne me pose des problèmes de compréhension. Si vous avez des conseils, je suis preneuse.

Réponse de l’équipe

Bonjour Émilie,

La notion de fiable ne porte pas sur un exercice mais sur un apprenant. Si un apprenant a dû effectuer davantage de 10 soumissions pour un exercice quel qu’il soit, alors cet apprenant n’est plus réputé fiable pour aucun exercice. Il ne faut alors pas tenir compte de ses résultats.

Bon courage !

FABIEN

Bonjour,

Une question bête pour être sûr de ne pas comprendre l’énoncé de travers : dans l’exemple donné, sommes-nous d’accord que l’apprenant 5 ne peut être considéré comme fiable puisqu’il n’a pas tenté la validation de l’Ex3 par UpyLaB (et bien qu’il ait validé les Ex1 et Ex2 en 1 seul essai chaque fois) et n’a donc pas (à proprement parlé) réussi l’exercice 3 ? Merci

Réponse de l’équipe

Bonjour Fabien,

Non. Un apprenant est réputé fiable dès lors qu’il n’a jamais dépassé 10 essais, même s’il a tout faux !

BACHIR

Bonjour,

Mon script fonctionne correctement sur Pycharm lorsqu’on lui donne les noms des fichiers, en paramètre ou avec input(). Mais sur UpyLab, j’obtiens un message d’erreur :

L'appel à votre programme sur l'input "/pub/data/result-pass-fail-0.csv↵/pub/data/result-count-0.csv↵" n'a rien renvoyé.

J’ai l’impression que je n’ai pas compris comment vous attendiez que l’on rentre les noms de fichiers.

Réponse de l’équipe

Bonjour Bachir,

Le code que tu soumets à UpyLaB n’affiche rien, car tu as seulement défini des fonctions. Il te faut les appeler pour qu’elles soient exécutées.

PASCALE

Bonjour,

J’ai enfin réussi dans PyCharm avec les fichiers _0 et les _1, le code fonctionne parfaitement, mais UpyLaB me renvoie l’erreur :

Ligne 41: ValueError: invalid literal for int() with base 10: 'VRAI'.

Pourriez-vous m’aider svp ? Merci d’avance.

Réponse de l’équipe

Bonjour Pascale,

N’aurais-tu pas inversé l’ordre dans lequel les noms de fichiers sont donnés depuis l’entrée ?

Bon courage !

ÉTIENNE

Bonjour,

Upylab ne valide pas mon programme alors que ce qui est attendu et ce qu’affiche mon programme sont exactement la même liste . Pouvez-vous m’aider ? Merci.

Réponse de l’équipe

Bonjour Étienne,

Ton code affiche une espace superflue après le nom de chaque exercice, ainsi qu’une ligne blanche supplémentaire à la fin.

Réponse d’Étienne

Merci, j’ai corrigé mon code et il a été accepté par UpyLaB. Si c’est possible, pouvez-vous me dire comment vous vous êtes aperçue que j’avais une espace superflue après le nom de chaque exercice et la ligne supplémentaire ? Encore merci.

Réponse de l’équipe

En sélectionnaant les résultats avec la souris dans UpyLaB, on voit apparaître ces espaces en trop. Cela dit, en l’occurrence, c’est la lecture de ton code qui m’a permis de faire cette constatation.

Bonne continuation !

JACOB

Bonjour,

L´ordre que j´obtiens dans PyCharm est correct alors que sur UpyLab il semble complètement aléatoire. Je n´arrive pas à comprendre d´où vient le problème puisque j’ai créé spécifiquement une fonction imprime qui va chercher les clefs de mon dictionnaire dans l´ordre décroissant et enfin va imprimer la liste (normalement ordonnée aussi) associée à chaque clef.

Je ne comprends pas pourquoi UpyLab me retourne un ordre complètement différent ?

Réponse de l’équipe

Bonjour Jacob,

Je pense qu’il y a un souci avec ta fonction faire_dico. En effet, tu crées dans un premier temps les clés de ton dictionnaire en prenant les différents éléments de la première ligne. Ensuite, pour chaque ligne, tu itères sur les clés pour leur associer la i-ème valeur de la ligne. Le souci, c’est que quand tu fais cela, les clés vont arriver dans n’importe quel ordre, et tu vas associer cette i-ème valeur à une clé dont l’indice n’était pas forcément i dans la première ligne.

Il s’agit donc encore ici d’un problème lié au fait qu’il n’y a pas de notion d’ordre dans un dictionnaire, du moins jusqu’à Python 3.7, et que lorsqu’on itère sur un dictionnaire, les items de celui-ci sont fournis dans un ordre tout à fait quelconque, indépendant de celui de leur création. Le problème n’apparaît pas localement chez toi si tu utilises une version ultérieure à Python 3.6.

Il te faut donc revoir comment tu associes tes valeurs aux clés.

J’espère que c’est assez clair.

Bon courage !