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 :

Somme de valeurs pour conditions identiques


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut Somme de valeurs pour conditions identiques
    Bonjour,

    J'ai un fichier texte de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    450 : 12151
    450 : 564561
    650 : 565664
    550 : 65656
    650 : 4646
    500 : 46646
    Je voudrais faire la somme des valeurs pour des conditions identiques.
    C'est-à-dire faire :
    450 : 12151 + 564561
    650 : 565664 + 4646
    etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    somme = open('somme.txt', 'r')
    somme = somme.read()
     
    Array = np.genfromtxt(StringIO(somme), 'string', delimiter=' ')
    J'ai converti mon fichier texte en Array.
    Mais je vois pas trop quelle boucle utiliser pour la suite.
    Si quelqu'un peut me mettre sur la piste...

    Merci.

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    pourquoi n'utilises-tu pas un dictionnaire dont les clés seraient tes "valeurs liens" et les valeurs, les sommes des deuxièmes nombres de chaque ligne, construites au fur et à mesure de la lecture des lignes ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    Je ne sais pas quel est le nombre de lignes du/des fichiers à parcourir mais ...
    Il est souvent préférable de processer un fichier à la volée plutôt que de charger tout le fichier puis de le processer ; ça évite d'avoir des problèmes si le fichier d'entrée est gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import collections
     
    count_map = collections.Counter() # ou collections.defaultdict(lambda:0) 
    # on utilise Counter/defaultdict(lambda:0) car qd la clé n'est pas trouvé dans count_map, il renvoie 0
     
    with open('somme.txt') as file:
        # on processe les lignes du fichier au fil de la lecture
        for line in file: 
            # on parse la ligne, parse() à définir
            key, value = parse(line)
            # on met à jour le dictionnaire en conséquence
            count_map[key] += value
    print dict(count_map)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par ZZelle Voir le message
    Je ne sais pas quel est le nombre de lignes du/des fichiers à parcourir mais ...
    Il est souvent préférable de processer un fichier à la volée plutôt que de charger tout le fichier puis de le processer ; ça évite d'avoir des problèmes si le fichier d'entrée est gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import collections
     
    count_map = collections.Counter() # ou collections.defaultdict(lambda:0) 
    # on utilise Counter/defaultdict(lambda:0) car qd la clé n'est pas trouvé dans count_map, il renvoie 0
     
    with open('somme.txt') as file:
        # on processe les lignes du fichier au fil de la lecture
        for line in file: 
            # on parse la ligne, parse() à définir
            key, value = parse(line)
            # on met à jour le dictionnaire en conséquence
            count_map[key] += value
    print dict(count_map)
    J'ai pas trop compris ce que c'était que parse...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par haraigo Voir le message
    J'ai pas trop compris ce que c'était que parse...
    Ce qui reste à coder .

    parse() prend en entrée une ligne et en extrait les 2 entiers:
    par exemple parse('123 : 456\n') renvoie le tuplet d'entiers (123, 456)

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 813
    Points : 7 102
    Points
    7 102
    Par défaut
    On pourrait pour un gros fichier utiliser mmap

    Array = np.genfromtxt(StringIO(somme), 'string', delimiter=' ')
    Je suis curieux de savoir sous quelle forme est renvoyé Array (en passant le minimum était de renvoyer le résultat)

    Un conseil supplémentaire parmi les autres déjà présents, est d'analyser une ligne de votre fichier texte.

    Pour ouvrir un fichier

    +1 pour ZZelle, prenez les bonnes habitudes with open c'est le bien.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Bon j'y arrive pas.
    C'est trop compliqué pour un débutant comme moi...

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 813
    Points : 7 102
    Points
    7 102
    Par défaut
    Pourtant ça reste simple (t'aurais pu montrer tes essais), on prend une ligne

    de là, faut supprimer le ":" avec split().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    key, value = line.split(':')
    Si tu remarques on se rend compte que pour faire ta somme tu auras besoin de nombres et non de chaîne de caractères, c'est à dire 12151 et non "12151".

    Ensuite on va créer un dictionnaire vide pour insérer notre key et notre value.

    On va créer une fonction avec comme arguments key et value pour modifier notre dictionnaire "dico".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def parse(key, value):
        if key not in dico:
            dico[key] = value # on ajoute la clé et la valeur dans le dictionnaire
        else:
            dico[key] += value # on fait la somme des 2 valeurs
    J'ai pas testé, mais en suivant simplement les étapes par exemple avec ton interpréteur, tu devrais réussir ce genre de chose.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def parse(key, value):
        if key not in dico:
            dico[key] = value # on ajoute la clé et la valeur dans le dictionnaire
        else:
            dico[key] += value # on fait la somme des 2 valeurs
    Attention le parse de fred1599 n'est pas le même que celui mentionné dans mon 1er message, celui-ci serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def parse(line):
         key, value = line.split(':') # on splitte en 2
         key, value = int(key), int(value) # on convertit en entier
         return key, value # done !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Merci pour vos réponses.
    En voyant vos réponses effectivement c'est pas très compliqué.
    Moi, j'étais parti dans des boucles ayant aucun sens.
    J'ai du mal à traduire en langage en fait.

    Sinon pour parse, j'avais vu le problème du coup j'ai enlevé la fonction et c'était nickel.

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 813
    Points : 7 102
    Points
    7 102
    Par défaut
    Sinon pour parse, j'avais vu le problème du coup j'ai enlevé la fonction et c'était nickel.
    J'ai pas compris, quel problème? enlevé la fonction?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    J'ai pas compris, quel problème? enlevé la fonction?
    C'est pas vraiment un problème c'est juste que c'était pas le même parse que ZZelle. Du coup, j'ai juste mis ça directement dans le main, plutôt que de définir une fonction parse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if key not in dico:
            dico[key] = value # on ajoute la clé et la valeur dans le dictionnaire
        else:
            dico[key] += value # on fait la somme des 2 valeurs

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

Discussions similaires

  1. [XL-2010] Somme de valeurs sous condition. SOMMEPROD ou INDEX ?
    Par Nessie37 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 03/03/2014, 23h45
  2. [XL-2010] Somme de valeur suivant condition sur cellule
    Par EricBOG dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 16/07/2013, 11h30
  3. Somme des valeurs sous condition
    Par ons1402 dans le forum Excel
    Réponses: 6
    Dernier message: 13/09/2012, 13h40
  4. [XL-2000] Somme de valeurs si condition
    Par DamKre dans le forum Excel
    Réponses: 4
    Dernier message: 15/11/2009, 15h58
  5. [XSLT] Faire la somme d'une valeur pour un ensemble de noeuds
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 10/03/2009, 09h45

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