Bonjour j'ai besoin d'aide pour cette exercice je n'y arrive vraiment pas je ne sais pas par où commencer merci de votre aide
Pièce jointe 531659
Version imprimable
Bonjour j'ai besoin d'aide pour cette exercice je n'y arrive vraiment pas je ne sais pas par où commencer merci de votre aide
Pièce jointe 531659
Salut,
La difficulté pour le programmeur Python est de savoir comment passer de "BBB" à sa forme canonique "AAA".
Soit f la fonction (inconnue) qui permet de passer d'une chaîne de caractères à sa forme canonique.
Fabriquer un dictionnaire où les clefs sont f(x) et les valeurs la liste des x correspondants est assez trivial:
et est tellement "commun" qu'on pourra réduire le nombre de lignes avec un defaultdict ou simplement avec .setdefaultCode:
1
2
3
4
5
6 D = dict() for x in ...: key = f(x) if key not in D: D[key] = [] D[key].append(x)
- W
bonjour merci mais du coup il faut faire comme cela et je suis censé mettre quoi à la place des pointillés s'il vous plaît:
Code:
1
2
3
4
5
6
7 def equiv_canonique(): D = dict() for x in ...: key = f(x) if key not in D: D[key] = [] D[key].append(x)
Ça ne fonctionne toujours pas ça me met erreur
Code:
1
2
3
4
5
6
7
8 def equiv_canonique(): D = dict() for x in d: key = f(x) if key not in D: D[key] = [] D[key].append(x) print(equivalence_canonique('BBB', CCC, BABA, ABBA))
Bonjour
Et tu te dis "expert sécurité" ? Remarque t'as raison, le titre d'expert n'est pas protégé en France. C'est à dire que n'importe qui peut se proclamer "expert" en quoi que ce soit sans avoir à fournir de quelconque certificat ou titre officiel. T'as même le droit de te proclamer "expert en orthographe" !!!
Donc ça ne fonctionne toujours pas ça te met erreur. Surtout ne nous dit pas quelle erreur ça te met, ça serait trop facile (oui, tant qu'à nous demander de l'aide, autant nous la challenger un peu). A mon avis, ça te met "erreur" lorsque tu appelles f(x). As-tu lu attentivement la phrase de wiztricks quand il écrit "Soit f la fonction (inconnue) qui permet de passer d'une chaîne de caractères à sa forme canonique." ??? Quel est le mot de cette phrase que tu ne comprends pas ? "inconnue" ??? ça signifie que cette fonction n'existe pas et que tu dois alors l'écrire
Accessoirement, si ta fonction est censée recevoir une liste de mots en paramètres, ce serait bien aussi de la définir dans ce sens. Remarque c'est peut-être là aussi l'erreur (quand tu écris for x in d: alors que "d" n'existe pas) :boulet:
Et quand tu postes un code, :tagcode:
Pièce jointe 531905Pièce jointe 531907
bonsoir mon professeur vient de modifier l'exercice il n'y a pas grande différence je pense ?
je n'arrive toujours pas à comprendre ce que je doit mettre à la place de f(x)Code:
1
2
3
4
5
6
7
8
9 def equiv_canonique(*donnee): D = dict() for x in D: key = f(x) if key not in D: D[key] = [] D[key].append(x) equiv_canonique(BBB, CCC, BABA, ABBA)
Explique avec des phrases comment, à partir de "BABA", tu obtiens "AZAZ" comme forme canonique ? Ou (inversement) comment à partir de "AZAZ" tu sais que "BABA" appartient à son groupe ?
Une fois que tu auras réussi à l'expliquer avec des mots et ordres simples, ne restera qu'à convertir ces mots et ordres en instructions Python.
Bonjour je ne comprends rien à l'énoncé qui t'a été donné:
pourquoi pas en réponse: {'AAA':['BBB','CCC'],'AZAZ':['BABA','ABAB']} à l'exemple donné vu que la clé DCCD peut renvoyer aussi à 'ABBA'.
En l'état difficile de proposer un algorithme vu le gros flou de la notion de canonicité dans l'énoncé; il n'y a pas de définition, juste un exemple et qui n'est pas clair du tout.
A+
mon prof m'a dit d'utiliser translate ()
https://www.journaldev.com/23697/pyt...ring-translate
salut,
avec translate() ça peut se faire mais ça me semble peu adapté
d'autant qu'il y a une petite vilénie dans l'exercice, 'ABBA' peut assez facilement donner 'CDDC' mais pas 'DCCD', ça oblige à bidouiller la translation dont on perd alors la logique, à ce stade une forêt de if adéquate ferait aussi bien le job à mon avis...
avec quelques regexp bien senties en revanche ça passe comme dans du beurre
1. Je verrais la liste transformée en dataframe.
2. Je construis une fonction qui pour chaque chaîne renvoie la clé.
3. J'applique la méthode apply sur le dataframe avec la fonction en paramètre afin d'obtenir une seconde colonne au dataframe qui donne la clé pour chaque chaîne en colonne 1.
4. Je boucle sur le dataframe et pour chaque valeur clé je fais un append pour ajouter les valeurs de chaine et obtenir le dictionnaire.
Pour la fonction j'analyse la chaine, je prends la plus petite lettre dans l'ordre alphabétique et lui affecte la valeur 00 puis chaque autre lettre l'écart. J'ai une correspondance de tableau de 00 à 25 qui affecte la lettre donc translate peut servir ici. 'TOTO' prend la valeur clé BABA.
A+
Cet énoncé est délirant ou incomplet : on tourne en rond car personne n'est capable de dire comment construire une clé dynamiquement (le machin canonique), puis comment tester quels mots respectent cette clé.
Le plus croustillant étant de voir ce que cet exercice est apparemment donné à de parfaits débutants en Python :cfou:
Hello, j'imagine ça mais ???
ce qui donne :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 canon = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" eq_canon = {} def equiv_canonique(mot) : indice = 0 dico = {} forme = '' res = '' for l in mot : if l not in dico : dico[l] = indice forme += str(indice) indice += 1 else : forme += str(dico[l]) for i in forme : res += canon[int(i)] if res not in eq_canon : eq_canon[res] = [mot] else : eq_canon[res].append(mot) equiv_canonique('toto') equiv_canonique('tata') equiv_canonique('tordu') print(eq_canon)
A adapter pour une liste de mot bien évidement.Code:{'ABAB': ['toto', 'tata'], 'ABCDE': ['tordu']}
En repartant de ta solution, je propose la solution suivante :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #fonction de calcul de la clé canonique def computeKey(mot): canon = iter("ABCDEFGHIJKLMNOPQRSTUVWXYZ") assoc, canonical_key = dict(), "" for l in mot: if not l in assoc: assoc[l]= next(canon) canonical_key += assoc[l] return canonical_key #fonction des équivalences canoniques def equiv_canonique(*word_list): dico = dict() for w in word_list: k = computeKey(w) dico[k] = dico.get(k, []) + [w] return dico # tests print(equiv_canonique("toto", "tata", "tordu"))
en voyant les solutions proposées et après relecture de l'énoncé je comprends un peu mieux la logique de l'exercice et l'intérêt de translate() finalement :
donc finalement la forme canonique est indexée sur le premier caractère du mot qu'on traite comme devant devenir un 'A', ce qui pour 'BABA' permet de donner 'AZAZ'Code:
1
2
3
4
5
6
7
8
9
10 def equiv_canonique(*donnee): dst = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' dico = dict() for mot in donnee: idx = (dst*2).index(mot[0]) src = (dst*2)[idx:idx+26] tab = str.maketrans(src, dst) cle = mot.translate(tab) dico[cle] = dico.get(cle, []) + [mot] return dico
Okay, je viens (enfin) de comprendre le principe de cette clé. Ton code est le plus efficient :ccool: