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 motif dans une liste


Sujet :

Python

  1. #21
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Je me suis aperçu que mon code est un peu nul.

    Si une ligne ’>identifiant3’ est toujours suivie de la ligne d’item correspondant , et en considérant régulière l’alternance de lignes ’>identifiant3’ et de lignes d’item, il est possible de se passer de la répétition de if line[0]==">"
    Il suffit de repérer la premiére ligne ’identifiant1’ pour bien commencer l’itération où il le faut, et de parcourir ensuite la liste d’une certaine façon encore plus condensée que celle que j’ai écrite.


    Le but n’est pas de mariner trop longtemps sur ce problème.
    Quelles sont tes idées ?

  2. #22
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    J'ai reussi à trouver des motifs qui match avec le nombre de caractères des item (j'ai pas reussi avec les "(.{2}..." que je faisait d'habitude ni avec les /w ou /s.
    Donc j'ai feinté (et c'est certainement une fois encore pas le plus simple), j'ai défini pour par exemple les item de 1 caractère;
    if " " in ligne[:2]: (ligne correspond à par exemple "A 45")
    Sa marche je les insere dans les Dico[ID][1] mais je n'arrive pas lorsqu'il y a plusieurs item de un caractère pour un ID à concaténé les deux item dans Dico[ID][1] c'est pas le truc le plus sorcier à faire.
    Je test plusieurs technique je révise (encore!) l'utilisation des dico

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    owned

    J'ai pour placer les valeurs dans MyDico ajouter sa au début de ton code:
    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
    if ID not in MyDico:
                    MyDico[ID]={1:[],2:[], 3:[],4:[],5:[]}
                for j in MyDico:
                    line2=fichier[i+1]
                    if j in line:
                        if " " in line2[1:]:
                            if " " in line2[:2]:
                                NewValue=MyDico[ID][1]
                                NewValue.append(line2)
                            elif " " in line2[:3]:                        
                                NewValue=MyDico[ID][2]
                                NewValue.append(line2)
                            elif " " in line2[:4]:                        
                                NewValue=MyDico[ID][3]
                                NewValue.append(line2)
                            elif " " in line2[:5]:                    
                                NewValue=MyDico[ID][4]
                                NewValue.append(line2)
                            elif " " in line2[:6]:                        
                                NewValue=MyDico[ID][5]
                                NewValue.append(line2)
    Donc maintenant c'est parfait mais ce que j'aimerais savoir si toi aussi tu a fais quelque chose dans ce style là ou si je me suis encore compliquer la vie de manière inutile?

    [EDIT] Le dernier elif peut etre remplacé par un "else:" si on considere que le fichier d'entré est normalisé (si un motif de inconnu se présente et qu'il n'entre pas dans l'un des if/elif sa risque de poser des problèmes), mais comme c'est un script a moi qui le génère on va dire qu'il est bien généré
    [/EDIT]

    Pour la suite et le rendu de la liste finale il suffisait je pense d'ajouter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                if MyDico[u][n]:
                    itm="".join(MyDico[u][n])
                    ls.append(itm)
                elif MyDico[u][n] == []:
                    ls.append("Inexistant")
            listresults.append(ls)
    Encore merci pour ta patience et de ne pas dévoiler un code entier directement,cela m'apporte beaucoup d'apprendre dans ces conditions.

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Voilà c'est good, le script inscrit directement les commande sql dans le fichier de sortie et sa fonctionne parfaitement.

    Prochaine étape effacer les doublons et automatiser la MAJ de la BDD par les différents scripts que j'ai pondu, mais avant WEEK END ; dans la forêt, dans les champs n'importe ou pourvu que je ne revois pas l'ordi AVANT lundi matin

    Merci à vous!

  5. #25
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Est-ce que tu pratiques un autre langage de prog ? Parce que j’ai l’impression que tu es imprégné de manières de penser qui contaminent ta façon de coder en Python.




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NewValue=MyDico[ID][1]
    NewValue.append(line2)
    est inutile. Cette ligne attache un nom NewValue comme une étiquette à un objet qui est atteignable par MyDico[ID][1]
    Cette dernière écriture suffit à Python pour trouver l’objet liste auquel il faut ajouter line2:
    MyDico[ID][1].append(line2)





    J’ai eu du mal à comprendre le complément de code que tu as mis.

    Je mets de coté l’indentation olé olé,
    je vois if j in line: j parcourt les clés de MyDico: identifiant1, identifiant2, identifiant3, etc
    et tu cherches aussi if j in line
    En faisant ça, tu sembles chercher à trouver la valeur ’identifiantx’ qui se trouve dans la ligne line.

    Mais il y a plus simple: si line vaut '>identifiant4' alors line[1:] vaut 'identifiant4' !

    Pourquoi es-tu capable d’écrire des line2[:2], line2[:3], line2[:4] etc et pas line[1:] ???





    Ensuite, la succession de if-elif-elif-elif-elif , c’est du travail de forçat.
    il faut avoir le réflexe à un moment de se dire: « en employant Python, ce n’est pas possible que ce soit aussi compliqué à faire que ce que je suis en train de développer. Il y a certainement plus simple. Il faut que je revois l’algorithme »
    Ton problème est celui-ci:
    Je n'ai donc pas une vision globale du problème qui permet de le résoudre plus efficacement.
    Dans le cas présent, “algorithme“ se réfère à ce bout de code à if-4 elif, et ’vision globale’ se réfère à l’ensemble de fonctions de traitement de chaînes.
    Il faut étudier cette page
    http://docs.python.org/release/2.5.4...s.html#l2h-233
    AVANT de se lancer dans un code qui manipule des chaînes.

    Bon, pour aller plus vite, je t’indique la fonction qu’il te faut regarder de près: split()







    (si un motif de inconnu se présente et qu'il n'entre pas dans l'un des if/elif sa risque de poser des problèmes),
    Bien vu. Mais c’est justement pour ça qu’il faut se dire que le code est trop compliqué pour faire quelque chose qui n’est même pas adaptable à un fichier avec identifiants quelconques.





    Sinon tu as trouvé la raison de mon utilisation d’une itération sur indice:
    quand i est l’indice d’une ligne ’>identifiant 3’, alors la ligne suivante est bien li[i+1]
    tandis que si on voulait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ligne dans fichier:
        if ligne[0]==’>’:
            suivante = fichier.readline()
    on obtiendrait une belle erreur
    ValueError: Mixing iteration and read methods would lose data

    Mon code avec une ligne de plus est donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    li = open('antwan.txt','r').read().splitlines()
    print '\n'.join(repr(u) for u in li )
     
    dico = {}
     
    for i in xrange(0,len(li),2):
        line = li[i]
        if line[0]==">":
            tifian = line[1:]
            if tifian not in dico:
                dico[tifian] = { 1:[], 2:[], 3:[], 4:[], 5:[] }
            suivante = li[i+1]
            dico[tifian][........................].append(suivante)

    En réorganisant un peu le code pour le simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    li = open('denis.txt','r').read().splitlines()
    print '\n'.join(repr(u) for u in li )
     
    dico = {}
     
    x = 0                # pour trouver le numero de la premiere ligne avec un 
    while li[x][0]!='>': # identifiant. De facon a etre sur de commencer 
        x = x + 1        # l'iteration qui suit a la bonne ligne
     
    for i in xrange(x,len(li),2):
        ID,suivante = li[i][1:],li[i+1]
        if ID not in dico: dico[ID] = { 1:[], 2:[], 3:[], 4:[], 5:[] }
        #dico[ID][........................].append(suivante)
    EDIT: remplacement de li[1:] par li[i][1:]


    reste à remplacer les points par une expression qui extraie le nombre de lettres présentes dans suivante.





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    itm="".join(MyDico[u][n])
    Oui. Sauf qu’il faut mettre un blanc comme séparateur et non pas un caractère de longueur zéro.

  6. #26
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    je préfère remplacer mon dernier code par celui-ci pour cause de ligne ’n’ à détecter pour l’arrêt de l’itération

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    li = open('antwant.txt','r').read().splitlines()
    print '\n'.join(repr(u) for u in li )
     
    dico = {}
     
    x = 0                # pour trouver le numero de la premiere ligne avec un 
    while li[x][0]!='>': # identifiant. De facon a etre sur de commencer 
        x = x + 1        # l'iteration qui suit a la bonne ligne
     
    while li[x][0]!='n':
        ID,suivante = li[x][1:],li[x+1]
        if ID not in dico: dico[ID] = { 1:[], 2:[], 3:[], 4:[], 5:[] }
        dico[ID][........................].append(suivante)
        x = x + 2

  7. #27
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Je comprend bien ton code et ce que tu écris seulement au jour d'aujourd'hui je n'ai pas ces reflexes là, je suis une certaine logique suivant la vision que j'ai du problème.
    Tu à l'impression que je me complique la vie et c'est vrai au final ton code est plus simple et clair il reste toutefois à l'élaboration plus complexe à mes yeux.

    Il me manque certainement de la pratique pour automatiser certain reflexes, certaine manières de penser la résolution des problèmes.

    Les incohérences d'indentations ou d'affectations inutiles c'est autre chose; des mauvaises habitudes qu'il faut corriger (le plus tôt sera le mieux...)

  8. #28
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Les codes des messages #25 et #26 sont différents, mais c’est le même algorithme.

    Je pensais que tu t’intéresserais à trouver la ligne manquante dans mes codes.



    Bon, on ne vas pas trainer 3 semaines sur le problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    li = open('antwant.txt','r').read().splitlines()
    print '\n'.join(repr(u) for u in li )
     
    dico = {}
     
    x = 0                # pour trouver le numero de la premiere ligne avec un 
    while li[x][0]!='>': # identifiant. De facon a etre sur de commencer 
        x = x + 1        # l'iteration qui suit a la bonne ligne
     
    while li[x][0]!='n':
        ID,suivante = li[x][1:],li[x+1]
        if ID not in dico: dico[ID] = { 1:[], 2:[], 3:[], 4:[], 5:[] }
        dico[ID][len(suivante.split()[0])].append(suivante)
        x = x + 2


    Une autre solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with open('antwant.txt','r') as f:
        ch = f.read()
     
    import re
    pat = re.compile('>(identifiant\d+)\s+(.+?)\r?\n')
    dico = {}
     
    for ma in pat.finditer(ch):
        ID,suivante = ma.groups()
        if ID not in dico: dico[ID] = { 1:[], 2:[], 3:[], 4:[], 5:[] }
        dico[ID][len(suivante.split()[0])].append(suivante)


    Pour éviter d’enregistrer des doublons, ilsuffit de remplacer les listes par des ensembles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    li = open('antwant.txt','r').read().splitlines()
    print '\n'.join(repr(u) for u in li )
    
    dico = {}
    
    x = 0                # pour trouver le numero de la premiere ligne avec un 
    while li[x][0]!='>': # identifiant. De facon a etre sur de commencer 
        x = x + 1        # l'iteration qui suit a la bonne ligne
    
    while li[x][0]!='n':
        ID,suivante = li[x][1:],li[x+1]
        if ID not in dico: dico[ID] = { 1:set([]) , 2:set([]) , 3:set([]) , 4:set([]) , 5:set([]) }
        dico[ID][len(suivante.split()[0])].add(suivante)
        x = x + 2

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    J'ai bien tenté de remplir les lignes manquantes de ton code, j'ai on va dire réussi à ma manière et à présent je vois que ta solution est beaucoup plus courte mais je dois avouer que je n'y serais pas parvenu seul

    En ce qui concerne les doublons ce n'est pas aussi simple que sa, il s'agit d'information en double stocké plusieurs fois dans les items relatif à un identifiant.

    Exemple; A 12 est la même chose que AA 6.
    UI 5 = IU 5
    H 25 = HHHHH 5
    Mais j'y suis presque il me reste un ou deux détails à régler.

    Encore merci

  10. #30
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Points : 52
    Points
    52
    Par défaut
    C cool alors si c'est résolu.

    Un bon réflexe consiste à le signaler aux autres que tu as obtenu une réponse en ajoutant [ RESOLU ] au titre du message ...

    Bye

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. la recherche de clé dans une liste en POO
    Par wafiwafi dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 20/08/2009, 15h50
  2. Réponses: 3
    Dernier message: 03/11/2008, 10h09
  3. Supprimer motif dans une liste
    Par Betty.m dans le forum Macro
    Réponses: 8
    Dernier message: 19/06/2008, 17h26
  4. recherche par attribut dans une liste d'objet
    Par Jacobian dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 28/05/2008, 21h11
  5. recherche de valeur dans une liste lag lead
    Par fatsora dans le forum Oracle
    Réponses: 1
    Dernier message: 31/01/2008, 08h28

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