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 :

Calcul pourcentage de différence entre string d'une liste


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Calcul pourcentage de différence entre string d'une liste
    Bonjour,

    J'ai un petit soucis pour calculer un pourcentage de différence entre le plus grand string et le plus petit string d'une liste , je m'explique :

    j'ai dans une boucle, des instructions qui récupère des prix sur une page web :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	patFinderPrice = re.compile('<b class="priceL">(.*)</b>')
    	findPatPrice = re.findall(patFinderPrice,webpage)
    	try:
    	    price = float(re.findall('?', findPatPrice[0])[0])  #sa coince ici (problème n°1)
    	except :
    	    price = 0          # sa coince ici (problème n°2)
    	tprice.append (price)
    problème n°1 :
    Les donnée que je récupère sont sous format :
    -décimale séparé d'une virgule(ex : 25,85)
    -les milliers sont séparé d'un point (ex : 5.999,99)
    moi au final dans la liste tprice, je veut retrouver des nombres décimaux :
    [25,85, 5999,99] de façons a pouvoir faire des calculs avec (voir problème n°3)
    je ne sais donc quoi mettre à la place du "?"

    problème n°2 :
    Pour corser un peu le problème, si le script ne trouve pas le prix, il doit
    afficher un élément vide dans la liste (dans mon exemple il y a "price=0" hors
    ce n'est pas bon puisque que sa va corrompre tout mes calcul de pourcentage.

    problème n°3 :
    Je souhaite calculer le pourcentage de différence entre les nombres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	pmax=max(tprice)
    	pmin=min(tprice)
    	difPourcent = int((pmin * 100) / pmax)-100
    	print difPourcent
    Une fois de temps en temps, difPourcent est négatif, je sais pas si ma formule déconne
    Et si non, comment forcer le résultat à être positif ?

    Merci

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Tout d’abord, ta première regex ne va pas faire ce que tu veux… le (.*) va tout bouffer jusqu’au dernier </b>*! Il faut utiliser un opérateur non-glouton (ou utiliser une regex plus sélective)*: '<b class="priceL">(.*?)</b>'. À noter toute fois, hors les cas simples (comme cela semble être le cas ici), mieux vaut utiliser un vrai parseur xml, les regex deviennent très vite frustrantes avec les formats récursifs*!

    Problème 1*: la seconde regex est totalement inutile. il suffit de remplacer les point par rien, et les virgules par des points*: price = float(findPatPrice[0].replace(".", "").replace(",", ".")).

    Problème 2*: Tu pourrais affecter None à ces éléments sans prix, ou mieux encore, Ellipsis (alias ...), qui est fait pour ça. Il faut ensuite que tes fonctions qui manipulent cette liste (celle qui calcule les pourcentage, notamment) gèrent (ignorent) les éléments ayant cette valeur. Cela vaut aussi pour min/max (donc faire par exemple max(p for p in tprice if p is not ...) –*attention, c’est un generator, c’est assez avancé et réservé au py3, si tu ne connais pas crée simplement une deuxième liste de prix ne contenant que les prix valables, et fais tes statistiques dessus)*!

    Problème 3*: J‘aurais même tendance à dire que ta fonction ne peut donner que des valeurs négatives ou nulles*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((100a)/b)-100 = 100((a/b)-1), <= 0 si a <= b
    De toute façon, la notion de “pourcentage de différence” me semble un peu floue, il y en a deux, me semble-t-il, le pourcentage à ajouter à pmin pour obtenir pmax, et celui à soustraire de pmax pour obtenir pmin –*il est normal et sain que ce dernier soit négatif*! Si tu veux le pourcentage min vers max, il suffit que tu intervertisses pmin et pmax.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Super ! merci pour toute ses indications ! je test tous sa et je repasse !

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Je viens de tester, et tout va comme il faut maintenant !
    Sa faisais quand même deux jours que jetait dessus à chercher une solution !
    Un Grand merci mont29 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/07/2006, 13h25
  2. Différence entre String et Int
    Par Alchimist dans le forum Langage
    Réponses: 6
    Dernier message: 05/04/2006, 11h00
  3. Réponses: 1
    Dernier message: 31/03/2006, 16h41
  4. différence entre <string.h> et <string>
    Par mister3957 dans le forum C++
    Réponses: 3
    Dernier message: 20/03/2006, 19h33

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