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 :

Grandeur des valeurs numériques


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut Grandeur des valeurs numériques
    Bonjour, je cherche une information plus au moins simple:

    Mon but est d'ajouter l'unité des chiffres à la fin de toutes les lignes que je recherche en ajoutant par exemple, 'K' avec un chiffre avec 3 zéro , avec six chiffre 'M'....
    Je recherche à traduire un chiffre selon sa grandeur en python:
    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        list=['K', 'M']    
        i = 0
            while (bandwidth[i].isdigit()):
                i += 1
            bandwidth_value = bandwidth[0:i]
            if bandwidth_value == xxxxxxx:
                bandwidth_value = bandwidth + list[1]
    C'est à la place de 'xxxxx', que je dois introduire la condition, et j'ai supposé qu'il s'agit d'un chiffre à 3 zéros

    Et merci d'avance

  2. #2
    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
    hmmm... pas très clair tout ça...
    Quel est le contexte ?
    Que contient bandwidth ?

    Encore une fois Annass, sois plus rigoureux dans l'énonciation de ton problème. C'est exactement comme un problème de math : si il manque un paramètre, le problème peut devenir insoluble...

    Si ça se trouve ton problème serait déjà résolu à l'heure qu'il est ...

    ex: Soit AB BC et AC, Que vaut AB+BC ? (de quoi parle-t-on ? des vecteurs, des longueurs ? quelles sont les valeur associées ? etc...)

    EDIT: Bon... analysons malgré tout ton code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        i = 0
            while (bandwidth[i].isdigit()):
                i += 1
    Apparemment bandwidth serait un string. Et à l'issu de cette boucle i est l'index du premier caractère non-digital
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            bandwidth_value = bandwidth[0:i]
            if bandwidth_value == xxxxxxx:
                bandwidth_value = bandwidth + list[1]
    Bon, l'orde de grandeur de bandwidth_value (qui est un string compsé de digit) peut être déterminé grâce à la longueur de sa chaine (qui ici est égale à i). Tu pourrais avantageusement remplacer list par un dico, les lettres représentant un ordre de grandeur et pour valeur une fonction lambda vérifiant l'appartenance de la valeur passée en paramètre à cette fonction, en partant de principe que par exemple pour des Ko on puisse avoir jusqu'a 999Ko avant de "passer" au Mo. Le tout donnerait quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            list={'K': lambda x: 0<=x<4, 'M': lambda x: 4<=x<7}    
            i = 0
            while (bandwidth[i].isdigit()):
                i += 1
            bandwidth_value = bandwidth[0:i]
            for o_g in list:
                if list[o_g](i):
                    bandwidth_value+=o_g
                    break
    La solution que je t'ai donnée est une solution un peu à l'arrache, il en existe plein d'autre, ce n'est qu'une question de logique.
    Tu m'diras aussi, y'a que de ça dans la programmation...

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    Il s'agit d'une ligne qui contient à la fois des lettres et des chiffre. Je cherche à touver les chiffre dans un premier temps, et ajouter l'unité à la fin. C'est tout

  4. #4
    Membre très actif

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 211
    Billets dans le blog
    1
    Par défaut
    Salut anass_59,

    C'est un peu flou tout ça.
    C'est quoi, pour toi, une ligne ?

    Soit c'est une chaine de caractères et alors on appelle ça une "string" et elle est délimitée par " " ou ' ' dans le code python.
    Soit c'est une liste (un tuple, un dictionnaire) et alors ce sont des "éléments" distincts indépendants les uns des autres comme par exemple :
    maListe = [1, 'a', 25, 'acd', 12.5, 'rez', 0, 11]

    Dans ce cas, il te suffit de lire chacun des éléments de la liste et de tester si c'est un nombre, un chiffre puis d'effectuer le traitement que tu veux.

    Si ce que tu cherches est dans une phrase comme par exemple :
    maPhrase = "J'ai trouvé 2357 mots sur la feuille".
    Alors ici, si tu veux trouver le nombre 2357, tu dois rechercher les espaces qui composent la phrase puis tester la chaine de caractère contenue entre deux espaces consécutifs dans la phrase.
    Attention au traitement du premier mot et du dernier qui n'ont peu-être pas d'espace de chaque côté : le premier n'a rien, le dernier peut en avoir un, avoir une ponctuation, un 0 de fin de chaine, un saut à la ligne.

    A+

  5. #5
    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
    Citation Envoyé par anass_59 Voir le message
    Il s'agit d'une ligne qui contient à la fois des lettres et des chiffre. Je cherche à touver les chiffre dans un premier temps, et ajouter l'unité à la fin. C'est tout
    C'est déjà un peu plus clair... mais il reste encore des questions que l'on peut se poser... Papy Octe en à déduit que bandwidth était une liste avec des integers (peut-être même des floats ?), et des strings. Perso, j'en ai déduit que que bandwidth était un string qui contenat des caractères alpha numériques. Tu vois comme le manque de précision peut être ouvert à différentes interprétations ?
    Ensuite, doits-tu récupérer tous les chiffres de ton string, ou bien seulement tous ceux situés au début de la chaîne ? J'ai supposé que c'était tous ceux du début. Pour le reste, voir l'edit de mon dernier post.

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    Désolé si je ne suis pas assez précis, mais c'est surtout à cause de l'ampleur du projet, car en fait la plupart des fonction sont liées. Je vais tenter d'être le plus clair possible:

    Donc il s'agit d'un traitement de fichier texte, je recherche à récupérer les valeur numériques qui se trouvent sur les lignes du textes qui contiennent bandwidth, en voici une:

    bandwidth 155000
    Donc je veux non seulement récupérer le chiffre qui est contenu dans la ligne, mais aussi ajouter les unités équivalentes . Merci.

    Pour ceux qui souhaitent voir le projet et m'aider dessus, contactez moi par MP. Car c'est pas le seul problème que je rencontre...

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    si je comprends bien tu extrais des lignes de la forme:
    d'un texte. Les valeurs sont dans une certaine unité (des octets ?) et tu veux afficher le résultats soit en kilooctets soit en mégaoctet en fonction de la valeur ?

    genre quelquechose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import math
     
    def affiche(value):
     
        if math.log10(value)>=6:
            print value/1.e6,"M"
        elif math.log10(value)>=3:
            print value/1.e3,"K"
        else:
            print value
    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> affiche(1.)
    1.0
    >>> affiche(999.)
    999.0
    >>> affiche(1024.)
    1.024 K
    >>> affiche(100000.)
    100.0 K
    >>> affiche(1000000.)
    1.0 M

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    Merci pour l'info, je vais essayer de l'appliquer à mon code pour voir si ca marche

  9. #9
    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
    Et pour récupérer juste les chiffres contenu dans un string, tu peux utiliser la fonction filter.
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> filter(str.isdigit,'bandwidth 1236')
    '1236'

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    J'ai besoin de récupéré, le chiffre en plus de l'unité qui le suit, (et je pense bien qu'il s'agit d'un string)

  11. #11
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    hmm

    tu veux dire que tes lignes sont comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bandwidth valeur unité
    exemple:

    à un moment donné, il va falloir que tu nous expliques ce que tu veux vraiment faire

    ok le projet est peut être gros, mais ce que tu essaies de faire à l'air d'être très "élémentaire" et il y a forcément quelqu'un ici qui va te dépanner, encore faut il qu'on ait les munitions pour le faire

    edit: hum hum dans le quote en rouge de N.tox j'ai vu une bonne grosse faute :p

  12. #12
    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
    Citation Envoyé par kango Voir le message
    ok le projet est peut être gros, mais ce que tu essaies de faire à l'air d'être très "élémentaire" et il y a forcément quelqu'un ici qui va te dépanner, encore faut il qu'on est les munitions pour le faire
    Exactement !

    Donnes-nous plusieurs exemple représentatifs des lignes de texte contenant bandwidth, je me répète mais... ce serait sûrement déjà résolu à l'heure qu'il est...

    Edit : @kango : J'osais pas te l'dire

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Méthode avec expression régulière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import re
     
    dico = dict(zip(["",'0','00','000',4*'0',5*'0',6*'0',7*'0',8*'0',9*'0'],\
                    ["",'da','h','K','daK','hK','M','daM','hM','G']))
     
    patBandw = re.compile(r'(.*?bandwidth \d+?)(0+?)\\par')
     
    f = open('zbru.rtf')
    for ln in f:
        m = patBandw.search(ln)
        if m:
            print m.group(1) + dico[m.group(2)]
    f.close()

    Méthode avec fonctions de chaîne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dico = dict(zip([0,1,2,3,4,5,6,7,8,9],["",'da','h','K','daK','hK','M','daM','hM','G']))
     
    f = open('zbru.rtf')
    for ln in f:
        xb = ln.find('bandwidth')
        if xb+1:
            chars = ln[xb+10:].rstrip('\\par\n')
            cnt = len(chars) - len(chars.strip('0'))
            if chars.isdigit() and cnt:
                print ln[:xb+10] + chars.strip('0') + dico[cnt]
    f.close()


    http://www.industrie.gouv.fr/metro/a...rt/prefixe.htm

    pour les préfixes.



    Je sais que les lignes du fichier se terminent par ’\\par\r\n' parce qu’il s’agit d’un fichier .rtf (si les choses n’ont pas changé 12 fois depuis la dernière fois....). C’est plus pratique pour produire un code immédiatement correct.



    Dans la première solution, un couple de parenthèses (autour) de caractères définit un GROUPE.
    Dans la RE, ’\d+?’ signifie: “1 ou plusieurs caractères-chiffres, tant que n’est pas rencontré le motif qui suit cette RE“
    Ici le motif suivant est formé de ’0’ suivis de ’\\par’.
    La RE est écrite de façon à ce que les ’0’ détectés ne soient qu’à la fin de la chaîne-nombre


    Si la regex matche avec une portion matchante:
    m.group() ou m.group(0) est la portion matchante dans son entier,
    m.group(1) est le premier groupe
    m.group(2) est le second groupe.



    Dans la deuxième solution, si ’bandwidth’ n’est pas dans la ligne alors xb vaut -1 et xb+1 vaut 0, et donc if xb+1: est analogue à if False:

  14. #14
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    je profite du fil pour vous donner un lien vers une librairie python qui gère (entre autres) les systèmes d'unités:

    http://dirac.cnrs-orleans.fr/plone/s...entificpython/

    c'est le module Scientific.Physics.PhysicalQuantities

    je ne crois pas avoir vu dedans les octets comme grandeur physique mais je pense que c'est facile à ajouter

Discussions similaires

  1. [C# 2.0] MaskedTextBox qui ne permet que des valeurs numériques
    Par Mast3rMind dans le forum Windows Forms
    Réponses: 9
    Dernier message: 01/09/2006, 10h33
  2. Meilleur type table pour stocker des valeurs numérique
    Par vodevil dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/04/2006, 20h42
  3. souci avec le format des valeurs numériques.
    Par LESOLEIL dans le forum Langage
    Réponses: 9
    Dernier message: 05/04/2006, 16h12
  4. Trier une colonne avec des valeurs numériques ou textes
    Par jfc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 11h15
  5. [xslt] filtrer des valeurs numériques
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/09/2005, 12h01

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