IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

round( . ,n) pour une liste


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut [Resolu] round( . ,n) pour une liste
    Bonjour a tous,

    J'ai un petit (mais vraiment petit) probleme pour afficher mes resultats...
    est ce que quelqu'un saurait comment on peut tronquer les decimales d'une liste?

    Un petit exemple pour illustrer mon probleme:
    Quand on manipuler de reels on peut faire comme ca:
    >>>a=1.4567844
    >>> round(a)
    1.0
    >>> round(a,2)
    1.46
    Quand on a une liste je sais comment faire la premiere operation (le round() tout simple):
    >>> b=[1.4567844,4.123474,5.123455]
    >>> map(round,b)
    [1.0, 4.0, 5.0]
    Mais je sais pas comment faire le round( b , 2) .....
    Quelqu'un a une idee?

    Merci d'avance.
    A+

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> b=[1.4567844,4.123474,5.123455] 
    >>> [round(n, 2) for n in b]
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si on applique la solution donnée, ça fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    b=[1.4567844,4.123474,5.123455]
    print [round(n, 2) for n in b]
    [1.46, 4.1200000000000001, 5.1200000000000001]
    ce qui n'est pas chouette.

    Je vous propose une fonction que j'ai développée pour une calculatrice et qui permet de formater les nombres à virgule flottante dans les listes (et les listes de listes), les tuples, les dictionnaires et les nombres complexes.

    En appliquant cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    b=[1.4567844,4.123474,5.123455]
    print arrond(b,2)
    [1.46,4.12,5.12]
    Cette fonction arrond() est ici: http://python.jpvweb.com/mesrecettespython/arrond

    Tyrtamos

  4. #4
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Tyrtamos, quelle version de python utilises-tu ? Car avec la 2.5.2, pas de problème, la première solution marche comme sur des roulette... ce qui m'a amené à penser que tu devais utiliser une version antérieure... non ?

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour N.tox,

    Merci de ta remarque. Moi aussi, j'aurais préféré la méthode simple.

    Je viens de faire les essais et je tombe dans tous les cas sur le même affichage pas beau:

    - sous Windows (XP sp2) et Python 2.5: même résultat sous IDLE et en console

    - sous linux (suse 10.3) et Python 2.5.1: même résultat sous IDLE et en console.

    - sous linux (suse 11.0) et Python 2.5.2: même résultat sous IDLE et en console.

    Il s'agit tout de même de 3 OS différents.

    ?????

    Tyrtamos

  6. #6
    Membre actif
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Par défaut
    Je confirme que j'obtient la même chose tyrtamos:
    Testé sur gentoo, ubuntu et xp, avec python 2.5.2.

    Je trouve ca bizarre!!!!!!!!!!!!!!!!!!!

    Quelqu'un a une explication?

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Ce n'est pas aussi étrange que ça. Cela dépend de la façon dont les ordinateurs stockent les nombres à virgule flottante en mémoire. Et ce n'est pas spécifique à Python qui ne fait que d'utiliser la bibliothèque du C.

    Par rapport à ce problème, l'instruction print essaie plutôt d'arranger les choses:

    Mais si le 0.1 est dans une liste, ça ne marche plus, et c'est ce qu'on retrouve dans la solution donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x=[0.1]
    print x
    [0.10000000000000001]
    On peut essayer d'arranger la solution donnée plus haut en formatant les nombres en chaîne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    b=[1.4567844,4.123474,5.123455]
    print [str(round(n, 2)) for n in b]
    ['1.46', '4.12', '5.12']
    Mais ce n'est pas très beau non plus, parce qu'on retrouve les apostrophes caractéristiques des chaînes de caractères.

    En fait, la seule solution que je connais, c'est de tout mettre en chaîne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    b=[1.4567844,4.123474,5.123455]
     
    p="["
    if b!=[]:
        for k in b:
            p+="%.2f" % (k) + ','
        p=p[0:-1]  # => pour retirer la dernière virgule
    p+="]"
     
    print p
    [1.46,4.12,5.12]
    Et là, l'affichage est correct. C'est ce que j'ai utilisé dans la fonction proposée plus haut, qui, en plus, explore les listes de listes, les tuples de tuples, ... de façon récursive pour traiter les "arbres".

    Tyrtamos

  8. #8
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    hum hum hum! heuuuu...
    En fait, j'ai simplement eu coup d'bol lors de mon précédent essai, j'aurais du en faire plusieurs... ça m'apprendra tiens ! Cause je viens de re-test, et en effet, ça foire en beauté... donc vraiment désolé pour cette fausse information...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a=[1.456319,1.54986184,1.461219464]
    >>> [round(b,2) for b in a]
    [1.46, 1.55, 1.46]
    par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> c=[1.56464,5.1544684,4.5464]
    >>> [round(b,2) for b in c]
    [1.5600000000000001, 5.1500000000000004, 4.5499999999999998]
    Allez savoir pourquoi...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut
    Merci pour toutes ces idees!

    Je vais utiliser la solution tyrtamos.

    A+
    Mattthieu

Discussions similaires

  1. [Debutant]creer une requete pour une liste deroulante
    Par torNAdE dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/07/2006, 15h22
  2. Réponses: 3
    Dernier message: 30/06/2006, 09h41
  3. Réponses: 3
    Dernier message: 13/04/2006, 18h04
  4. implémenter la notion "au moins" pour une liste d'
    Par mohamed dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 18/08/2004, 00h07
  5. [Debutant(e)]conseil pour une liste ?
    Par Tymk dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2004, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo