Partage
  • Partager sur Facebook
  • Partager sur Twitter

Code pour mesurer l'indentation

exercice

    29 février 2020 à 13:29:01

    Plusieurs points par rapport à ton code :

    • Tu ouvres le fichier avec open mais celui-ci n'est jamais fermé. Il serait préférable d'utiliser un bloc with pour cela : with open('indentation.txt', 'r') as fichier:
    • .read() va charger la totalité du fichier en mémoire, et ensuite tu appliques un splitpour le découper en lignes. C'est coûteux. Les fichiers sont directement itérables sur leurs lignes, donc tu pourrais simplement écrire for ligne in fichier:
    • Ta boucle ‘or intérieur ne s'arrête pas aux premiers espaces de la ligne mais les compte tous, il ne s'agit donc pas de mesurer l'indentation.
    • Tu concatènes tous les résultats dans une seule chaîne de caractères result sans séparation, il n'est alors plus possible de savoir quelle ligne correspond à quoi. Par exemple, si sur un fichier de 3 lignes tu obtiens '1234', peux-tu dire comment étaient indentées les différentes lignes ?
    • Partager sur Facebook
    • Partager sur Twitter
      29 février 2020 à 19:10:10

      ''' Mesurer l'indentaton dans le fichier indentation.txt '''
      
      results = ''
      
      with open('indentation.txt', 'r') as file:
          for ligne in file:
              i = 0
              for char in ligne:
                  if char == ' ':
                      i += 1
                  else:
                      break
              results += f'{str(i)} '
      
      print(results)

      merci beaucoup , voila un code qui semble prendre en compte tes conseils

      -
      Edité par arkanzay 29 février 2020 à 19:24:28

      • Partager sur Facebook
      • Partager sur Twitter
        1 mars 2020 à 21:10:46

        C'est mieux, oui, il ne reste plus qu'à corriger le dernier point que j'évoquais.

        • Partager sur Facebook
        • Partager sur Twitter
          2 mars 2020 à 11:22:47

          Je ne comprends pas bien, avec le code ci dessus, je ne pourrais jamais avoir 1234 pour un fichier de 3 lignes
          • Partager sur Facebook
          • Partager sur Twitter
            2 mars 2020 à 11:57:44

            Ah, l'espace ne m'avait pas sauté aux yeux, désolé. Mais je trouve quand même étrange de renvoyer le résultat sous forme d'une chaîne de caractères. Pourquoi pas simplement une liste de nombres ?

            • Partager sur Facebook
            • Partager sur Twitter
              26 février 2023 à 15:37:16

              def mesurer_indentation(ligne: str):
                  counter = 0
                  for c in ligne:
                      if c.isspace():
                          counter += 1
                      else:
                          break
                  return counter
              Perso, j'utilises isspace() pour prendre en compte d'autres caractères que l'espace.
              • Partager sur Facebook
              • Partager sur Twitter
                26 février 2023 à 17:28:56

                Pas forcément efficace:
                def mesurer_indentation(ligne):
                    return len(ligne) - len(ligne.lstrip(' '))

                Ou en lambda récursif:

                mesurer_indentation = lambda ligne: 0 if not ligne or ligne[0] != ' ' else 1 + mesurer_indentation(ligne[1:])

                -
                Edité par PierrotLeFou 26 février 2023 à 17:36:39

                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  27 février 2023 à 13:12:14

                  Comment tu ferais pour mesurer les caractères isspace à gauche? Ou même juste espace et tab


                  PierrotLeFou a écrit:

                  Pas forcément efficace:
                  def mesurer_indentation(ligne):
                      return len(ligne) - len(ligne.lstrip(' '))

                  Ou en lambda récursif:

                  mesurer_indentation = lambda ligne: 0 if not ligne or ligne[0] != ' ' else 1 + mesurer_indentation(ligne[1:])

                  -
                  Edité par PierrotLeFou il y a environ 19 heures



                  -
                  Edité par KongkeoXayavongkeo 27 février 2023 à 13:15:41

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 février 2023 à 14:41:03

                    from string import whitespace
                    def mesurer_indentation(ligne):
                        return len(ligne) - len(ligne.lstrip(whitespace))
                     
                    mesurer_indentation = lambda ligne: 0 if not ligne or not ligne[0].isspace() else 1 + mesurer_indentation(ligne[1:])

                    -
                    Et pour la "droite":
                     
                    from string import whitespace
                    def mesurer_indentation(ligne):
                        return len(ligne) - len(ligne.rstrip(whitespace))
                     
                    mesurer_indentation = lambda ligne: 0 if not ligne or not ligne[-1].isspace() else 1 + mesurer_indentation(ligne[:-1])

                    -
                    Edité par PierrotLeFou 27 février 2023 à 14:46:49

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      27 février 2023 à 16:54:13


                      Okay merci ;)

                      string.whitespace:space, tab, linefeed, return, formfeed, and vertical tab

                      lstrip & rstrip prend en paramètre un char ou charset


                      PierrotLeFou a écrit:

                      from string import whitespace
                      def mesurer_indentation(ligne):
                          return len(ligne) - len(ligne.lstrip(whitespace))
                       
                      mesurer_indentation = lambda ligne: 0 if not ligne or not ligne[0].isspace() else 1 + mesurer_indentation(ligne[1:])

                      -
                      Et pour la "droite":
                       
                      from string import whitespace
                      def mesurer_indentation(ligne):
                          return len(ligne) - len(ligne.rstrip(whitespace))
                       
                      mesurer_indentation = lambda ligne: 0 if not ligne or not ligne[-1].isspace() else 1 + mesurer_indentation(ligne[:-1])

                      -
                      Edité par PierrotLeFou il y a environ 1 heure



                      • Partager sur Facebook
                      • Partager sur Twitter

                      Code pour mesurer l'indentation

                      × 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