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 :

Recherche de valeurs et somme de valeurs correspondantes


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Recherche de valeurs et somme de valeurs correspondantes
    Bonjour,

    Je débute en python et souhaite manipuler des valeurs d'un fichier txt.

    Mon fichier txt contient des données du type:
    0.3 ; 1.5
    1 ; 0.5
    1.5 ; 2
    0.3 ; 0.1
    0.3 ; 0.5
    1.5 ; 1.5
    etc

    Je voudrais simplement faire un petit programme qui recherche une valeur (à gauche), somme les valeurs correspondantes (à droite) et efface les lignes en trop.
    Je voudrais obtenir au final quelque chose comme ça:
    0.3 ; 2.1
    1 ; 0.5
    1.5 ; 3.5

    Merci pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par GregLass Voir le message
    Bonjour,

    Je débute en python et souhaite manipuler des valeurs d'un fichier txt.

    Mon fichier txt contient des données du type:
    0.3 ; 1.5
    1 ; 0.5
    1.5 ; 2
    0.3 ; 0.1
    0.3 ; 0.5
    1.5 ; 1.5
    etc

    Je voudrais simplement faire un petit programme qui recherche une valeur (à gauche), somme les valeurs correspondantes (à droite) et efface les lignes en trop.
    Je voudrais obtenir au final quelque chose comme ça:
    0.3 ; 2.1
    1 ; 0.5
    1.5 ; 3.5

    Merci pour votre aide.
    Bonsoir,
    Ce n'est pas très compliqué. Les étapes sont:
    -> ouvrir le fichier
    [-> tout mettre dans un dictionnaire (attention aux valeurs: après lecture ce seront des chaînes de caractères).
    -> créer un nouveau dictionnaire
    -> parcourir le premier en remplissant le second.
    ]
    -> tout mettre dans un dictionnaire en ajoutant directement une valeur à la valeur existante.
    Ensuite afficher le résultat.

    Clodion
    PS: il est aussi possible de passer par les listes, mais il faut alors gérer les deux listes en parallèle.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci!!!

    Je ne connaissais pas les dictionnaires!
    J'essaye de me débrouiller seul pendant quelques jours...selon mes nouveaux problèmes je resolliciterai l'aide du forum.

    Encore merci!

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Après plusieurs le mieux que j'ai fait ressemble à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    obj = open('testdico.txt','r')
    data=obj.read()
    #print(data)
    res = open('resdico.txt','w')
    ligne=data.split('\n')
    col=ligne.split(' ; ')
    deb=col[0]
    prob=col[1]
    dico={}
    i=1
    while i<len(ligne):   
        if deb not in dico:
            dico[deb]=prob
        else:
            dico[deb]+=prob
        res.write(dico)
        i=i+1
    objet.close()
    res.close()
    Malheureusement et malgré mes recherches je ne comprends pas le problème...peut etre avec le fait que certaines valeurs sont du type : 5.1188e-13 par exemple???

    Je joints le fichier txt...si ça peut aider! testdico.txt

    Merci d'avance!

  5. #5
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Une lib qui serait intéressante pour lire ou écrire ce genre de fichier serait csv.

    Je suis pas spécialiste de cette lib, ni d'aucune d'ailleurs
    Mais ça simplifierait un peu la chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import csv
     
    lecteur = csv.reader(open('testdico.txt'), delimiter=';', quoting=csv.QUOTE_NONNUMERIC)
     
    donnees = dict()
    for n in lecteur :
        if n[0] not in donnees.keys() :
            donnees[n[0]] = 0
        donnees[n[0]] += n[1]
     
    # Affichage
    for k in sorted(donnees.keys()) :
        print(k, ':', donnees[k])
    Le temps ronge l'amour comme l'acide.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup!

    Mais quand j'enregistre le dictionnaire dans un .txt : j'obtiens une liste non-rangée entre {}!!! Et quand je l'enregistre dans un .csv j'obtiens un fichier vide!

    As-tu une idée???

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bon après moult bricolage, voici le code (du type Frankenstein fait du bouts glanés sur les forums) qui me donne les résultats que je souhaite.

    Je le pose si ça peut aider mais je pense qu'on peut faire bien mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import os
    import csv
    import json
     
    lecteur = csv.reader(open('testdico.txt'), delimiter=';', quoting=csv.QUOTE_NONNUMERIC)
    donnees = dict()
    for n in lecteur :
        if round(n[0],0)  not in sorted(donnees.keys()) :
            donnees[round(n[0],0)] = 0
        donnees[round(n[0],0)] += n[1]
     
    # Affichage
     
    for k in sorted(donnees.keys()) :
        print(k, ';', donnees[k])
    json.dump(donnees, open("dict.txt",'w'))
     
    with open("dict.txt", "r") as f:
        lines = [line.strip('{}') for line in f.readlines()]
     
        print(lines)
    f.close()
     
    with open("dict.txt", "w") as f:
        f.writelines(lines)
    f.close()
     
    fichier = open('dict.txt','r')
    fichier2 = open('dict2.txt','w')        
    lignes = fichier.readlines()                
    for ligne in lignes:
        ligneFinale = ligne.replace(',','\n')
        print(ligneFinale)
        fichier2.write(ligneFinale)             
     
    fichier = open('dict2.txt','r')
    fichier2 = open('dict.txt','w')        
    lignes = fichier.readlines()                
    for ligne in lignes:
        ligneFinale = ligne.replace('"',"")
        print(ligneFinale)
        fichier2.write(ligneFinale) 
     
    fichier = open('dict.txt','r')
    fichier2 = open('dict2.txt','w')        
    lignes = fichier.readlines()                
    for ligne in lignes:
        ligneFinale = ligne.replace(' ','')
        print(ligneFinale)
        fichier2.write(ligneFinale)
     
    fichier = open('dict2.txt','r')
    fichier2 = open('dict.txt','w')        
    lignes = fichier.readlines()                
    for ligne in lignes:
        ligneFinale = ligne.replace(':'," ; ")
        print(ligneFinale)
        fichier2.write(ligneFinale) 
     
    fichier.close()                     
    fichier2.close()
    os.remove('dict2.txt')
    Je vais continuer à résoudre mon problème de .csv et reposterai mes "bricolages".

    J'ai une autre demande : je cherche à faire une somme cumulative (j'ai essayé avec numpy.cumsum mais je n'y arrive pas).
    En reprenant mon premier post, avec:
    0.3 ; 2.1
    1 ; 0.5
    1.5 ; 3.5
    Je souhaite obtenir :
    0.3 ; 2.1
    1 ; 2.6
    1.5 ; 6.1

    Une idée?
    Merci d'avance!

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GregLass Voir le message
    Merci beaucoup!

    Mais quand j'enregistre le dictionnaire dans un .txt : j'obtiens une liste non-rangée entre {}!!! Et quand je l'enregistre dans un .csv j'obtiens un fichier vide!

    As-tu une idée???
    Je n'ai pas bien saisi, mais je pense que tu as du parcourir la lecture une seconde fois, donc forcément, il n'y a plus rien à lire
    C'est le principe même d'une lecture d'un fichier.

    Citation Envoyé par GregLass Voir le message
    J'ai une autre demande : je cherche à faire une somme cumulative (j'ai essayé avec numpy.cumsum mais je n'y arrive pas).
    En reprenant mon premier post, avec:
    0.3 ; 2.1
    1 ; 0.5
    1.5 ; 3.5
    Je souhaite obtenir :
    0.3 ; 2.1
    1 ; 2.6
    1.5 ; 6.1

    Une idée?
    Merci d'avance!
    Bah c'est simple, il suffit d'initialiser une variable à 0, et au fur et à mesure l'incrémenter.
    Il n'y a pas réellement de difficulté ici, mais j'ai peut-être pas bien saisi.

    En ce qui concerne numpy, je ne connais pas, donc je ne sais si cela est possible et surtout si dans ce que tu veux faire et obtenir il est adapté, c'est hors de mes très modestes compétences.
    Le temps ronge l'amour comme l'acide.

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Autre solution avec les tuples

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    def sumOfTuples(line, listTuples, delimiter=';'):
        x, y = line.strip('\n').split(delimiter) # on vire les fins de ligne et on récupère les deux valeurs
        x, y = map(float, (x, y)) # on cast les valeurs en flottant
        for ind, tuples in enumerate(listTuples):
            a, b = tuples
            if a == x:
                b += y # on additionne la valeur à la précédente
                listTuples[ind] = (a, b) # on remplace l'ancien tuple par le nouveau
                return
        listTuples.append((x, y)) # si on trouve pas le tuple, on l'ajoute comme nouveau tuple
     
    myValues = []
     
    with open('test.txt', 'r') as f:
        for line in f:
            sumOfTuples(line, myValues)
     
    print(myValues)
    myValues renverra

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [(0.3, 2.1), (1.0, 0.5), (1.5, 3.5)]
    Bonne journée
    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)

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Je galère vraiment avec cette histoire de somme cumulative, j'ai essayé (entre autres) ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for n in lecteur :
        for n[0] in sorted(donnees.keys()) :
        n[1] += n[1]
    mais cela me renvoie un fichier vide!

    Une idée svp? je n'arrive vraiment pas à faire cette somme cumulatives des valeurs puis à les assigner à leurs clés d'origine.

    D'avance merci!

  11. #11
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut,

    Comprends-tu ce que tu fais ?
    Je ne pense pas.

    En reprenant le code de départ, c'est avec la variable donnees que tu dois travailler, ce qui la construit, tu ne dois pas y toucher, à moins que ne veuilles en modifier la structure, si par exemple l'ordre des données de ton fichier doit rester tel quel, dans ce cas ce n'est plus avec un dict que tu devras travailler, mais avec des listes.

    Si le cumul des valeurs doit s'effectuer du plus petit au plus grand, alors c'est bon avec le dict.

    Il suffit simplement de parcourir le dictionnaire comme la boucle l'affichant, mais en cumulant donc les valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cumul = 0
    for k in sorted(donnees.keys()) :
        cumul += donnees[k]
        donnees[k] = cumul
    Je te conseille d'utiliser des print partout où tu as du mal à déterminer le fonctionnement d'un morceau de code
    Le temps ronge l'amour comme l'acide.

  12. #12
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonjour,
    Désolé pour ce retard.
    Voilà ce que j'avais en tête lors du post précédent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    NOM_FICL = "fichier_tmp00"    # donnees
    NOM_FICE = "fichier_tmp01"    # resultats
     
    dct = {}
    with open(NOM_FICL, "r") as fic:
        for ligne in fic.readlines():
            clef, val = ligne.strip().split(";")
            dct[float(clef)] = dct.setdefault(float(clef), 0) + float(val)
     
    with open(NOM_FICE, "w") as fic:
        for clef in sorted(dct.keys()):
            fic.write("{} ; {}\n".format(clef, dct[clef]))
    Bon, avec le fichier fourni, il reste 605 lignes dans le fichier résultats, contre 1000 dans le fichier de données. Voici les premières lignes du fichier résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1.21 ; 0.0006143840728327632
    1.27 ; 0.00014619318244513124
    1.28 ; 0.0002452623739372939
    1.33 ; 5.8956826251232997e-05
    1.43 ; 2.1073830794193782e-05
    Clodion

Discussions similaires

  1. Recherche et somme de valeurs
    Par NBARAKAT dans le forum Excel
    Réponses: 3
    Dernier message: 28/04/2015, 20h17
  2. Recherche une valeur et récupérer la ligne correspondante.
    Par impur dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/07/2010, 13h06
  3. Réponses: 3
    Dernier message: 24/08/2006, 11h56
  4. Somme des valeurs de certaines lignes
    Par Tartenpion dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/02/2006, 16h46
  5. Somme de valeurs d'une colonne d'un DBGrid
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/12/2004, 23h58

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