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 :

Dictionnaires imbriqués et recherche de mots


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 63
    Par défaut Dictionnaires imbriqués et recherche de mots
    Bonjour,

    Je débute en Python et voiçi ce que je souhaite faire. Récupérer la position de tout les mots 'AZERTY'
    en ignorant les caractères '-'
    J'ai un dictionnaire qui ressemble à ça (appelons le m)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {
      'toto' : { 'seq' : 'AZER-TY'}, 
      'score': 1202,
      'tata' : { 'seq' : 'OSEF-AZERTY'},
      'foo' : { 'seq' : 'AZ-ERTY'},  
      'score' : 31415,
      'faa' : {'seq' : 'TRUCMUCHEBIDULE-A-Z-E-R-T-Y'}
    }
    J'ai une liste liste_m contenant plusieurs dictionnaires m différents mais tous ayant le même modèle.

    Voiçi mon 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
    # @type : function
    #*@name : position
    # @resume : retourne la position (début et fin) de la sequence reconnue dans TOUT le dictionnaire
    # @param dico_total : <type lst>, liste de dictionnaire contenant tout les alignements
    #*@param seqs_reconnues : <type lst>, liste contenant tout les mots a tester
     
    def position(dico_total, seqs_reconnues):
    	for i in dico_total:
    		#print i,"TOTO"
    		for j in i:
    			if j!='score':
    				#print j,"                                                ","TuTu"
    				for k in seqs_reconnues:			
    					print k,':',[l.span() for l in re.finditer(k, i[j]['seq'])]
     
    position(liste_m, ['AZERTY'])

    J'explique l'idée du code :
    La première boucle permet de rentrer dans le 1er élément de la liste (donc le premier dictionnaire)
    La seconde boucle permet de travailler dans les différentes clefs de premier niveau (toto et foo ici)
    La boucle k n'est ici que si on recherche plusieurs mots donc osef
    Le print final permet d'afficher la liste des positions trouvées.
    On recherche avec re.finditer et notre mot dans la string qui a toujours 'seq' pour clef et on recup sa position avec span(). On boucle sur le finditer afin de récupérer toutes les itérations de ce mot On place ensuite toutes les positions dans une liste avant de le printer.


    Ma fonction parvient à récuperer la position du mot dans tata mais je souhaiterais qu'il fasse fi des '-' et récupère les position de tout les autres tout en prenant en compte dans les position des '-' ignorés pour la reconnaissance du mot.

    Par exemple le mot sera reconnu en foo avec pour span : (0,6).
    Voilà si vous avez une petite idée pour m'aider , j'espère avoir été clair mais n'hésitez pas à demander des éclairssissements si nécessaire.

    Merci à vous

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    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
    >>> import re
    >>> samples = 'AZER-TY', 'OSEF-AZERTY', 'AZ-ERTY', 'TRUCMUCHEBIDULE-A-Z-E-R-T-Y', 'FAIL-A-Z-E-R-Y'
    >>> rs = ''.join([ c + '[-]{0,1}' for c in 'AZERTY' ])
    >>> for s in samples:
    ...     m = re.search(rs, s)
    ...     if m:
    ...        print s, '=>', m.span()
    ...     else:
    ...        print s, '=> *KO*'
    ...
    AZER-TY => (0, 7)
    OSEF-AZERTY => (5, 11)
    AZ-ERTY => (0, 7)
    TRUCMUCHEBIDULE-A-Z-E-R-T-Y => (16, 27)
    FAIL-A-Z-E-R-Y => *KO*
    non?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Recherche de mot commençant par une chaine dans un dictionnaire
    Par ram-0000 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 20/04/2012, 18h09
  2. [OpenOffice] [DEBUTANT] dictionnaire et recherches de mots [Résolu]
    Par Jasmine80 dans le forum OpenOffice & LibreOffice
    Réponses: 4
    Dernier message: 17/12/2008, 08h48
  3. Rechercher un mot dans un dictionnaire
    Par NeMo_O dans le forum C
    Réponses: 4
    Dernier message: 10/02/2007, 15h31
  4. Réponses: 10
    Dernier message: 22/05/2004, 13h51
  5. Recherche multi-mots sur une seule colonne
    Par Badiste dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2004, 11h24

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