Partage
  • Partager sur Facebook
  • Partager sur Twitter

Explications et conseils sur un exercice en pytho

Sujet résolu
    9 février 2016 à 14:33:02

    # -*- encodage: utf-8 -*-
    #---------------------------------------------
    def systemeEcriture(texte):#nom de la fonction
        catfreqdic={}# dictionnaire renvoyant la categorie de #lettre la plus présente dans le texte
        for car in texte:
                print car
                if car in catfreqdic:
                        catfreqdic[car] = catfreqdic[car] + 1 #j'augmente le comptage de la categorie de la lettre
                        print "il y'a maintenant", catfreqdic[car], "fois dans le dictionnaire" 
                else:                
                        catfreqdic[car]=1
                        print "maintenant il y'a ", catfreqdic[car], "fois"   
        return  catfreqdic
        for catfreqdic[car] in catfreqdic:
            sorted(catfreqdic,key=catfreqdic.get)
    texte= " 史上最高のダンス・グルーヴ!のニューサウンド&スタイルが幕を開ける!未体験ゾーンへ突入する待望のニュー・シングルです♪"
    print systemeEcriture(texte)


    Bonjour, actuellement je suis un exercice en python qui stipule :

    Bonjour Monsieur,
    Je me permets de vous écrire car j'effectue en ce moment un exercice d'entraînement en python et je bloque sur la fonction.
     l'exercice stipule: 
    Ecrire une fonction systemeEcriture qui 
    prend un texte comme entrée
    Donne en sortie la catégorie de lettres la plus fréquente dans le texte :
    LATIN, GREEK, CJK, ...
    Créer une série de textes d'échantillon :
    Japonais,Chinois, Coréen ,Arabe, Persan ,Grec, Espagnol
    Tester la fonction systemeEcriture avec vos échantillons de manière à ce que le script affiche :
    “La catégorie de lettres la plus fréquente du fichier japonais.txt est KATAKANA”
    “La catégorie de lettres la plus fréquente du fichier chinois.txt est CJK
    j'en suis venu à l 'écriture suivante, cependant je bloque au niveau de l'écriture de la ligne qui permettre d'afficher la catégorie de lettre la plus importante; pour l'instant la fonction ne fait que compter et afficher le nombre de lettre. Si vous pourriez m'éclairer davantage. (vous la trouverez également en fiche jointe). j'ai décidé de tester d'abord sur le texte en Japonais.
    je vous remercie d'avance  de toute aide.

    -
    Edité par KELODJOUENGUEMEGNEEMMANUELLECYNTHIA 9 février 2016 à 23:15:49

    • Partager sur Facebook
    • Partager sur Twitter
      9 février 2016 à 14:37:16

      -
      Edité par KELODJOUENGUEMEGNEEMMANUELLECYNTHIA 9 février 2016 à 23:16:43

      • Partager sur Facebook
      • Partager sur Twitter
        9 février 2016 à 16:36:43

        Comme tu l'as remarqué, une capture d'écran c'est pas génial. Et du code sans mise en forme ça l'est pas non plus smiley. Heureusement ce site intègre un outil pour avoir une bonne présentation du code (coloration syntaxique, numérotation des lignes, ...). C'est la bonne pratique sur ce site pour intégrer du code, alors n'hésite pas à t'en servir ;):

         Thank you smiley

        -
        Edité par Olygrim 9 février 2016 à 18:52:15

        • Partager sur Facebook
        • Partager sur Twitter
        Précepte: Le mieux est l'ennemi du bien
          10 février 2016 à 0:54:27

          Si je pars du principe que ton code fait bien ce qu'il doit faire (je parle des ligne 1 à 13), les lignes 14 et 15 posent toutefois un problème. Il y a 2 configurations possibles:

          • Soit ta fonction renvoie le dictionnaire, et donc tu fais le traitement après l'avoir appelée:

          def systemeEcriture(texte):#nom de la fonction
              catfreqdic={}
              for car in texte:
                  print car
                  if car in catfreqdic:
                      catfreqdic[car] = catfreqdic[car] + 1
                      print "il y'a maintenant", catfreqdic[car], "fois dans le dictionnaire"
                  else:               
                      catfreqdic[car]=1
                      print "maintenant il y'a ", catfreqdic[car], "fois"  
              return  catfreqdic
          
          
          texte= " 史上最高のダンス・グルーヴ!のニューサウンド&スタイルが幕を開ける!未体験ゾーンへ突入する待望のニュー・シングルです♪"
          
          dico = systemeEcriture(texte)
          lst_triee = sorted(dico, key=dico.get)
          
          print(lst_triee[0])

          • Soit tu fais le tri dans ta fonction et tu ne renvoie que la catégorie la plus fréquente:

          def systemeEcriture(texte):#nom de la fonction
              catfreqdic={}
              for car in texte:
                  print car
                  if car in catfreqdic:
                      catfreqdic[car] = catfreqdic[car] + 1
                      print "il y'a maintenant", catfreqdic[car], "fois dans le dictionnaire"
                  else:               
                      catfreqdic[car]=1
                      print "maintenant il y'a ", catfreqdic[car], "fois"
              
              plus_frequente = sorted(catfreqdic, key=catfreqdic.get)
              return  plus_frequente
          
          
          texte= " 史上最高のダンス・グルーヴ!のニューサウンド&スタイルが幕を開ける!未体験ゾーンへ突入する待望のニュー・シングルです♪"
          print(systemeEcriture(texte))


          À toi de voir quelle sortie tu désires pour ta fonction ^^
          • Partager sur Facebook
          • Partager sur Twitter
          Précepte: Le mieux est l'ennemi du bien
            10 février 2016 à 1:17:46

            olygrim @merci beaucoup. je vais essayer les deux.
            • Partager sur Facebook
            • Partager sur Twitter
              10 février 2016 à 1:52:20

              Rebonsoir,

              peut être que c'est moi qui approfondie trop l'exercice mais en relisant l'exercice , je pensais que la fonction devait m'afficher < les types de caractères lettres, je m'explique : par exemple pour le japonais, il afficheraist  dans le cadre de l'exemple plus haut que c'est  la catégorie "katakana" la plus grande , le "latin" pour un texte en français. ou j'ai plus besoin de rajouter de ligne code avec une variable "unicodedataname"

              Merci d'avance

              • Partager sur Facebook
              • Partager sur Twitter
                10 février 2016 à 11:26:00

                Effectivement, en regardant mieux ton code je m'aperçois qu'il ne fait que compter les occurrences de chaque lettre. Donc tu ne réponds pas à l'exercice. La manière la plus naïf de le faire, ça serait d'enregistrer chaque alphabet dans un tuple:

                alphabet = ("abcdefghijklm....", "grec: ...", "japonais: ...", ...)
                


                Et de chercher dans quel alphabet se trouve la lettre. Une fois trouver tu ajouterai +1 à une liste de compteur de même taille que ta liste. Et tu pourrais ajouter la ponctuation en première position (si elle ne fait partie d'aucun alphabet en particulier).

                alphabets = (" .,'", "abcdefghijklm....", "grec: ...", "japonais: ...", "...")
                
                compteurs = [0, 0, 0, 0, ...]
                
                for lettre in texte:
                    for ind, alph in enumerate(alphabets):
                        if lettre in alph:
                            compteurs[ind] += 1
                            break


                Un truc comme ça. MAIS 2 choses:

                • Je ne suis même pas sûr que ça fonctionne étant donné qu'il y a  ces histoires d'encodage. Donc faudra peut-être faire du decode/encode, et là je ne m'y connais pas DU TOUT (jamais touché).
                • Et en admettant que ça fonctionne, mon algo n'est pas génial. On pourrait par exemple utiliser des sets au lieu des chaînes pour stocker les lettres de chaque alphabet (ainsi l'utilisation du in est optimisé). Ou ne stocker aucun alphabet, mais que des range contenant la valeur unicode de l'alphabet. Par exemple pour l'alphabet latin, ord("A") -> 65 et ord("z") -> 122 donc un range(65, 123) pour le latin (à peu près car entre les majuscule et les minuscules il y a quelques termes [, \, ], ...). Mais bon ça donne une bonne première approximation (tu peux d'ailleurs le donner comme argument à ton prof). Et sûrement d'autres optimisations que je n'arrive pas à voir immédiatement :o.
                for i in range(65, 123):
                    print(chr(i))


                PS: Je dis ça, mais je suis pas super convaincu par ma solution avec les range (j'ai l'impression que ça rajoute des opérations supplémentaires comparé au set):

                alphabets = (set(" .,'"), set("abcdefghijklm...."), set("grec: ..."), set("japonais: ..."), set("..."))
                
                compteurs = [0, 0, 0, 0, ...]
                
                for lettre in texte:
                    for ind, alph in enumerate(alphabets):
                        if lettre in alph:
                            compteurs[ind] += 1
                            break
                • Partager sur Facebook
                • Partager sur Twitter
                Précepte: Le mieux est l'ennemi du bien
                Anonyme
                  10 février 2016 à 13:27:09

                  1. Définir un dictionnaire en tant que constante contenant tous les caractères existant classés par catégorie ;
                  2. Utiliser un defaultdict pour compter les occurrences de chaque catégorie des caractères présents dans le texte ;
                  3. Utiliser la fonction max pour sortir la catégorie de caractères la plus utilisé dans le texte ;

                  Voici :

                  #!/usr/bin/env python3
                  # -*- coding:utf-8 -*-
                  
                  
                  from collections import defaultdict
                  # Un 'defaultdict' est un dictionnaire qui a la particularité de créer
                  # automatiquement les items inexistant en leur donnant une valeur par défaut.
                  # Voir la documentation pour plus de détails ('help(collections.defaultdict)').
                  
                  
                  CHARS_BY_CATEGORY = {
                      # 'Nom de la categorie' : u'tous les caractères de la catégorie',
                      'ARABIC' : u'...', # Le préfixe 'u' sert à Python 2, il déclare une chaîne
                      'CJK' : u'...',    # unicode (utf-8), comme ça pas de problème d'encodage.
                      'GREEK' : u'...',
                      'KATANAKA' : u'...',
                      'LATIN' : u'...',
                      # ...
                  }
                  
                  
                  def get_most_category(text):
                      counter = defaultdict(int)
                      for char in text:
                          for category, chars in CHARS_BY_CATEGORY.items():
                              if char in chars:
                                  counter[category] += 1
                                  break
                      return max(counter, key=counter.get)
                  

                  Note: J'ai mis un break en pré-supposant qu'il ne peut exister qu'une seule catégorie par caractère, si ce n'est pas le cas il faut supprimer cette instruction.

                  -
                  Edité par Anonyme 10 février 2016 à 13:29:16

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Explications et conseils sur un exercice en pytho

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown