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 :

Rechercher une valeur proche dans tableau à partir d'une liste


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Rechercher une valeur proche dans tableau à partir d'une liste
    Bonjour,

    je suis de retour avec Python après un heureux évènement... sauf que j'ai tout oublié ou presque.

    J'essaie de "croiser" une liste de fréquence avec un fichier type excel... en fait j'essaie de trouver dans mon tableau (colonne 0) la valeur la plus proche pour chacune des valeurs de ma liste et dès que je l'ai trouvée, prendre la valeur du tableau de la ligne correspondante dans la colonne 3... pour être claire je joins les fichiers.

    Voici ce que j'ai écris pour le moment... mais ça me met un beau message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FreqFile = open(fileFreq,'r')
    ListeF = [ float(f) for f in (FreqFile) ]
    print "Liste des fréquences de calcul", ListeF
    FreqFile.close()
    for FreqVal in ListeF :
        for ligne in open(fileS21,'r'):
            print ligne.index(FreqVal)
    Je vous remercie par avance pour votre aide.

    Patricia
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    De quel message d'erreur parles-tu, on a plutôt l'embaras du choix avec ton code.

    Quoiqu'il en soit, est-ce que ce code répond à ta question ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # -*- coding: utf-8 -*-
     
    FreqFile = open('fileFreq.txt', 'r')
    ListeF = [ float(f) for f in (FreqFile) ]
    print "Liste des fréquences de calcul", ListeF
    FreqFile.close()
    for FreqVal in ListeF :
        with open('S21_001135.txt', 'r') as inf:
            lines = inf.readlines()
            for idx, line in enumerate(lines):
                if line.startswith(str(FreqVal)):
                    print "Freqval {0} line {1}: {2}".format(FreqVal, idx, line)

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par bourgui78 Voir le message
    dès que je l'ai trouvée, prendre la valeur du tableau de la ligne correspondante dans la colonne 3...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Freqval {0} line {1}: {2}".format(FreqVal, idx, line.split()[3])
    ?

    @+
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Note:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeF = [ float(f) for f in (FreqFile) ]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if line.startswith(str(FreqVal)):
    Puisque nous avons du texte et du texte tout ceci est inutile : Autant comparer (line.startswith()) puis convertir si vous avez besoin de float.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Note:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeF = [ float(f) for f in (FreqFile) ]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if line.startswith(str(FreqVal)):
    Puisque nous avons du texte et du texte tout ceci est inutile : Autant comparer (line.startswith()) puis convertir si vous avez besoin de float.

    @+
    Mon intention était de corriger simplement les lignes lacunaires, non pas de réécrire le code.

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Mon intention était de corriger simplement les lignes lacunaires, non pas de réécrire le code.
    Et moi de même VinsS (index) et non de corriger ton code (juste une info vis à vis de ton .startswith()). Tu n'as retenu que la 'note' ressortie du contexte

    Ceci dit dans l'attente de vous lire bourgui78.

    @+

    PS: heureux événement ? Félicitations
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Merci beaucoup
    Désolée pour la réponse tardive... mais je ne travaille pas le mercredi
    et merci à PauseKawa...

    Alors j'ai repris ce qu'a écrit VinsS, mais voilà :
    • pourquoi pour 1 fichier, la valeur de la fréquence à comparer est à 1 décimale (alors que j'ai fait la modif il y a 2 décimales) et pour l'autre fichier il ne se soucie aucunement de cela.
      au final cela me fait une liste de valeur possible, or je voudrais la valeur vraie à défaut la valeur le plus proche - là c'est un cas simple
    • Comment extraire du fichier S21, la valeur du module (colonne3) et seulement cette valeur qui par la suite me servira pour un calcul (la résisitivité si cela vous intéresse)[


    J'ai mis en doc joint mes fichiers et le résultat obtenu

    Je vous remercie encore pour votre aide.

    Patricia
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Pour la valeur la plus proche en cas de non-égalité, ce n'est plus pareil.

    Regarde si ceci est 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
     
    # -*- coding: utf-8 -*-
     
    DATA = 'fileFreq.txt'
    VALUES = 'S21_001135.txt'
     
    def get_data():
        with open(DATA, 'r') as inf:
            return [float(f) for f in inf]
     
    def get_frequences():
        with open(VALUES, 'r') as inf:
            lines = inf.readlines()
            frequences = []
            values = []
            for line in lines[1:]:
                l = line.split('\t')
                frequences.append(float(l[0].strip()))
                values.append(l[2].strip())   # 3 eme colonne ou index 3 ?
        return frequences, values
     
    def find_nearest(val, low, up):
        vals = (val-low, up-val)
        return vals.index(min(vals))
     
    def get_values():
        data = get_data()
        freq, vals = get_frequences()
        result = []
        freq.append(1000)
        vals.append(1000)
        lf = freq.pop(0)
        vl = (vals.pop(0), vals.pop(0))
     
        for dat in data:
            while 1:
                uf = freq.pop(0)
                if dat > uf:
                    lf = uf
                    vl = (vl[1], vals.pop(0))
                    continue
     
                elif dat == lf:
                    result.append((dat, vl[0]))
     
                elif dat == uf:
                    result.append((dat, vl[1]))
     
                else:
                    result.append((dat, vl[find_nearest(dat, lf, uf)]))
     
                lf = uf
                vl = (vl[1], vals.pop(0))
                break
     
        return result
     
    if __name__ == '__main__':
        res = get_values()
        for i in res:
            print i

    Edit: Corrigé le code

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Merci C'est génial !
    Encore merci, ça fait bien ce que je demandais

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut C'était résolu oui mais...
    Voilà le programme est aléatoire.
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
     fileModAff = tkFileDialog.askopenfilename(Fichier Texte","*.txt")],
                                             title = 'Sélection du fichier des mesures d''affaiblissement')
      fileFreq = tkFileDialog.askopenfilename(initialdir=,
                                             filetypes = [("Txt", "*.txt"),("Fichier Texte","*.txt")],
                                             title = 'Sélection du fichier des fréquences')
     
     
     
    def get_data():
        with open(fileFreq, 'r') as inf:
            return [float(f) for f in inf]
     
    def get_frequences():
        with open(fileModAff, 'r') as inf:
            lines = inf.readlines()
            frequences = []
            vModAff = []
            for line in lines[1:]:
                l = line.split('\t')
                frequences.append(float(l[0].strip()))
                vModAff.append(float(l[3].strip()))
        return frequences, vModAff
     
    def find_nearest(val, low, up): # Détermination de la méthode de recherche de la valeur proche
        vals = (val-low, up-val)
        return vals.index(min(vals))
     
    def get_FreqAff(): # Création de la liste de fréquence / affaiblissement 
        data = get_data()
        freq, vals = get_frequences()
        FreqAff = []
        freq.append(10000)
        vals.append(10000)
        lf = freq.pop(0)
        vl = (vals.pop(0), vals.pop(0))
     
        for dat in data:
            while 1:
                uf = freq.pop(0)
                if dat > uf:
                    lf = uf
                    vl = (vl[1], vals.pop(0))
                    continue
     
                elif dat == lf:
                    FreqAff.append((dat, vl[0]))
                elif dat == uf:
                    FreqAff.append((dat, vl[1]))
     
                else:
                    FreqAff.append((dat, vl[find_nearest(dat, lf, uf)]))
     
                lf = uf
                vl = (vl[1], vals.pop(0))
                break
     
        return FreqAff
     
     
    def get_freq(): # Création de la liste de fréquence à partir du fichier de fréquences
        data = get_data()
        freq, vals = get_frequences()
        listFreq = []
        freq.append(10000)
        vals.append(10000)
        lf = freq.pop(0)
        vl = (vals.pop(0), vals.pop(0))
     
        for dat in data:
            while 1:
                uf = freq.pop(0)
                if dat > uf:
                    lf = uf
                    vl = (vl[1], vals.pop(0))
                    continue
     
                elif dat == lf:
                    listFreq.append(dat)
     
                elif dat == uf:
                    listFreq.append(dat)
     
                else:
                    listFreq.append(dat)
     
                lf = uf
                vl = (vl[1], vals.pop(0))
                break
     
        return listFreq
     
    def get_ModAff(): # Création de la liste des valeurs des affaiblissements 
        data = get_data()
        freq, vals = get_frequences()
        listModAff = []
        freq.append(10000)
        vals.append(10000)
        lf = freq.pop(0)
        vl = (vals.pop(0), vals.pop(0))
     
        for dat in data:
            while 1:
                uf = freq.pop(0)
                if dat > uf:
                    lf = uf
                    vl = (vl[1], vals.pop(0))
                    continue
     
                elif dat == lf:
                    listModAff.append(vl[0])
     
                elif dat == uf:
                    listModAff.append(vl[1])
     
                else:
                    listModAff.append(vl[find_nearest(dat, lf, uf)])
     
                lf = uf
                vl = (vl[1], vals.pop(0))
                break
     
        return listModAff
     
     
    Affaiblissement = []
    Frequence = []
    if __name__ == '__main__':
        res_Affaiblissement = get_ModAff()
        res_frequence = get_freq()
        for i in res_Affaiblissement:
            Affaiblissement.append(i)
        for j in res_frequence:
            Frequence.append(j)
     
    CalculRho = zip(Frequence,Affaiblissement)
    Mais avec un ficheir de fréquence plus conséquent, cela ne fonctionneme plus.

    J'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "R:\LABO HF\DEP HF\USER\PVincent\Param S - Développement Informatique\Python\Programme Python 2.7\ParamS_Ligne_inHomogene.py", line 237, in <module>
        print get_ModAff()
      File "R:\LABO HF\DEP HF\USER\PVincent\Param S - Développement Informatique\Python\Programme Python 2.7\ParamS_Ligne_inHomogene.py", line 233, in get_ModAff
        vl = (vl[1], vals.pop(0))
    IndexError: pop from empty list
    Je pense que cela correspond au nb de digit de croisement pour la valeur proche... mais je ne trouve pas.

    A l'aide

    Merci encore pour votre aide

    Patricia
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/11/2012, 11h25
  2. Suppression d'une ligne d'un tableau à partir d'une valeur de cellule
    Par jerem1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/12/2010, 14h15
  3. Remplir un tableau à partir d'une valeur initiale
    Par Maliciouss dans le forum Pascal
    Réponses: 9
    Dernier message: 13/12/2009, 14h46
  4. Réponses: 28
    Dernier message: 05/03/2009, 12h55
  5. Réponses: 1
    Dernier message: 26/09/2007, 17h50

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