Partage
  • Partager sur Facebook
  • Partager sur Twitter

Simplification de programme

Sujet résolu
    5 décembre 2015 à 10:57:57

    Bonjour ! Voici mon code:

    import matplotlib.pylab as plt
    
    def recupere(N):
        fich=open(N,"r")
        ligne=fich.readline()
        lignes=[]
        while ligne:
            lignes.append(ligne)
            ligne=fich.readline()
        fich.close()
        return lignes
    
    
    def affichage1(altitudes):
        a=[c[:-2] for c in recupere(altitudes)]
        x=[]
        y=[]
        X=""
        Y=""
        for c in a:
            for i in range(len(c)):
                if i < c.index(";"):
                    X += c[i]
                if i > c.index(";"):
                    Y += c[i]
            x.append(X)
            y.append(Y)
            X=""
            Y=""
    
        return plt.plot(x,y)
    
    print recupere("altitudes.txt")
    print affichage1("altitudes.txt")

    Voici le fichier altitudes.txt que j'utilises:

    0;0
    
    1.0000000000;3.6454893673
    
    2.0000000000;6.8488331934
    
    3.0000000000;8.0029050247
    
    4.0000000000;7.0796465459
    
    5.0000000000;6.6669921255
    
    6.0000000000;8.2579661077
    
    7.0000000000;12.4478223594
    
    8.0000000000;11.2292995019
    
    9.0000000000;9.7010174805
    
    10.0000000000;11.3125529924

    Voici ce que j'obtiens:

    ['0;0\r\n', '1.0000000000;3.6454893673\r\n', '2.0000000000;6.8488331934\r\n', '3.0000000000;8.0029050247\r\n', '4.0000000000;7.0796465459\r\n', '5.0000000000;6.6669921255\r\n', '6.0000000000;8.2579661077\r\n', '7.0000000000;12.4478223594\r\n', '8.0000000000;11.2292995019\r\n', '9.0000000000;9.7010174805\r\n', '10.0000000000;11.3125529924\r\n']

    Voilà, j'aimerais simplifier la fonction affichage1 avec des listes par compréhension :) pourriez vous me guider sans me donner un réponse tout faite ?

    a=[c[:-2] for c in recupere(altitudes)]
    x=[c[i] for c in a for i in range(len(c)) if i < c.index(";")]
    y=[c[i] for c in a for i in range(len(c)) if i > c.index(";")]

    J'ai pensé à quelque chose comme ci-dessus mais cela affiche en réalité une liste chaque caractère du texte.

    PS: la fonction recupere est une fonction que j'ai programmé et qu'il ne faut pas changer car elle est utilisée dans par plusieurs autres fonctions dans mon TP.

    -
    Edité par poncinloic 5 décembre 2015 à 11:02:07

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      5 décembre 2015 à 11:19:02

      PS: la fonction recupere est une fonction que j'ai programmé et qu'il ne faut pas changer car elle est utilisée dans par plusieurs autres fonctions dans mon TP.

      Oui m'enfin il y a quand même plus simple

      def recupere(N):
          with open(N, 'r') as f:
              return f.readlines()


      Remarque 1: La variable N est un nom mal choisi, comment deviner que l'on a à faire un chemin de fichier ?

      a=[c[:-2] for c in recupere(altitudes)]

       Ça c'est pas beau !

      a=[c.rstrip('\r\n') for c in recupere(altitudes)]

      Remarque 2: Noms de variable encore mal choisi et rstrip à au moins le mérite d'être clair sur ce que tu souhaites faire !

      Remarque 3: Les lists comprehensions ne sont pas une fin en soit, elle rend le code un peu plus efficace, mais ça se fait en fin de code quand on à vérifier que tout est fonctionnel.Mais je préfère de loin

      lines = []
      for line in recupere(path):
          lines.append(line.rstrip('\r\n'))

      Remarque 4: Si on veut que se soit efficace, alors si j'ai la possibilité d'utiliser numpy je l'utilise à 100%...

      Ensuite pour virer les points virgules, la fonction split existe

      for line in lines:
          n1, n2 = line.split(';')
          X.append(n1)
          Y.append(n2)

      Remarque 5: Je n'aurais pas pris le temps de lire ton code, comme cela il est totalement illisible, va falloir faire un effort, car c'est de la philosophie dont on parle, on essaye de rendre simple et compréhensible son code -> Zen de python



      • Partager sur Facebook
      • Partager sur Twitter
        5 décembre 2015 à 11:35:32

        Merci ! Pour la fonction recupere, oui c'est vrai c'est plus simple et j'ai appris à programmer avec le with mais c'est que ce que j'ai fais est une méthode imposée dans mon TP :) Et pour le reste tu viens de m'apprendre pas mal de truc, merci je vais bosser dessus !
        • Partager sur Facebook
        • Partager sur Twitter
          5 décembre 2015 à 12:59:58

          Voilà !

          import matplotlib.pylab as plt
          
          def recupere(texte):
              with open(texte, "r") as fich:
                  return fich.readlines()
          
          def affichage1(altitudes):
              x=[]
              y=[]
              for ligne in recupere(altitudes):
                  for caractere in ligne:
                      X,Y=ligne.split(';')
                  x.append(X)
                  y.append(Y)
              return plt.plot(x,y)

          J'ai rajouté ta fonction recupere pour que ce soit plus court mais dans mon TP je devrais garder ma fonction.

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            5 décembre 2015 à 13:12:27

            Eh bien ça ne devrait pas être bon car on ne fait pas le traitement sur un caractère mais sur une ligne, il y a donc une boucle de trop...
            • Partager sur Facebook
            • Partager sur Twitter
              5 décembre 2015 à 13:30:04

              Étrangement ça fonctionnait.. je viens de comprendre le principe merci :)

              def affichage1(altitudes):
                  x=[]
                  y=[]
                  for ligne in recupere(altitudes):
                      X,Y=ligne.split(';')
                      x.append(X)
                      y.append(Y)
                  return plt.plot(x,y)


              Et juste par curiosité penses-tu qu'on puisse faire une liste par compréhension avec ce .split() ?

              -
              Edité par poncinloic 5 décembre 2015 à 13:31:32

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                5 décembre 2015 à 15:16:48

                Je ne pense pas, tu as deux listes, par contre si se sont des coordonnées on peut les mettre sous la même forme qu'une coordonnée mathématique

                coords = [(x, y) for x, y in ligne.split(';')]
                plt.plot(*zip(*coords))

                Attention, non testé !

                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2015 à 18:02:13

                  Merci pour ces infos bonne soirée ! :)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Simplification de programme

                  × 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