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 :

Remplacer des occurrences à partir d'un dictionnaire


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2014
    Messages : 6
    Par défaut Remplacer des occurrences à partir d'un dictionnaire
    Bonjour à tous,

    Voila plusieurs jours que j'essaye de me démêler avec un bout de code en vain, pas étonnant, sachant que je suis nouveau en python et n'en saisi pas encore toute la logique.
    J'aimerais, à partir d'un dictionnaire, remplacer toutes les occurrences contenues dans une liste de plusieurs listes. D'une manière plus claire, on a :

    les sequences = [['TTT[T/G]TTT'], ['GGG[A/C]TTT']]
    Et le dictionnaire = {'A':'A','C':'C','G':'G','T':'T','[A/C]':'M','[A/G]':'R','[A/T]':'W','[C/G]':'S','[C/T]':'Y','[G/T]':'K','[C/A]':'M','[G/A]':'R','[T/A]':'W','[G/C]':'S','[T/C]':'Y','[T/G]':'K'}

    Et j'aimerais obtenir :

    sequences = [['TTTKTTT'], ['GGGMTTT']].

    Sachant que j'ai plusieurs dizaines de listes dans ma liste sequences contenant quasiment tous au moins une clé de mon dictionnaire.

    J'ai commencé ça :

    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
    dictionnaire = {'A':'A',
        	'C':'C',
        	'G':'G',
        	'T':'T',
        	'[A/C]':'M',
        	'[A/G]':'R',
        	'[A/T]':'W',
        	'[C/G]':'S',
        	'[C/T]':'Y',
        	'[G/T]':'K',
        	'[C/A]':'M',
        	'[G/A]':'R',
        	'[T/A]':'W',
        	'[G/C]':'S',
        	'[T/C]':'Y',
        	'[T/G]':'K'}
     
    for lettres in str(Sequences):
    	print iupacdict.get(lettres)
    1) J'obtiens bien le remplacement mais uniquement des caractères seuls (A, T, C, G)
    2) J'obtiens un seul caractère par ligne

    J'ai donc essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mregex = ''
    for lettres in Sequences:
        mregex += iupacdict.get(lettres)
     
    print mregex
     
    tosearch = re.compile(str(mregex))
    for i in tosearch.findall(Sequences):
        print i
    Mais j'obtiens l'erreur suivante :
    Traceback (most recent call last):
    File "tmp.py", line 84, in <module>
    mregex += iupacdict.get(lettres)
    TypeError: unhashable type: 'list'

    Je ne sais donc pas trop comment m'en défaire, auriez-vous quelques pistes à me donner pour obtenir le résultat souhaité ?

    Merci, bonne journée,

    Emmanuel.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,
    Je ne vais pas vous gâcher le plaisir d'apprendre!
    Juste quelques pistes:
    On initialise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> SEQ = ['TTT[T/G]TTT', 'GGG[A/C]TTT']
    >>> DICO = {'A':'A','C':'C','G':'G','T':'T','[A/C]':'M','[A/G]':'R','[A/T]':'W',
    '[C/G]':'S','[C/T]':'Y','[G/T]':'K','[C/A]':'M','[G/A]':'R','[T/A]':'W','[G/C]':
    'S','[T/C]':'Y','[T/G]':'K'}
    >>> s = SEQ[0]
    Pourquoi avoir fait séquences comme liste de listes?
    Maintenant on applique un re.search, m.span retourne (debut, fin) du "match":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> m = re.search(r'(\[\w/\w\])', s)
    >>> m.span()
    (3, 8)
    >>> key = s[3:8]
    >>> key
    '[T/G]'
    On remplace avec la valeur dans DICO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> v = DICO.get(key)
    >>> n = s[:3] + v + s[8:]
    >>> n
    'TTTKTTT'
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Un simple replace() aurait suffit aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    new = []
    for seq in SEQUENCES:
        s = seq[0]
        print seq
        for k in dic.keys():
            s = s.replace(k, dic[k])
        new.append([s])
     
    print SEQUENCES
    print new
     
    [['TTT[T/G]TTT'], ['GGG[A/C]TTT']]
    [['TTTKTTT'], ['GGGMTTT']]
    Les regex c'est bien lorsque l'on ne sait pas ce que l'on cherche.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Un simple replace() aurait suffit aussi
    .....
    Les regex c'est bien lorsque l'on ne sait pas ce que l'on cherche.
    Ça "fonctionne" mais c'est plutôt bourrin car ça essaie de remplacer toutes les clés du dico...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2014
    Messages : 6
    Par défaut [RESOLU]
    Bonjour à tous les deux,

    Merci pour vos conseils. J'aurais été tenté d'appliquer la solution de VinsS mais entre temps, il s'est avéré qu'il n'était peut être pas nécessaire d'avoir une liste de listes. Donc si j'ai :
    Sequences = ['TTT[T/G]TTT', 'GGG[A/C]TTT']
    avec un dictionnaire assez complet, je peux finalement faire :

    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
    inMotif=False
    motif=""
    newSeqs=[]
    for seq in Sequences:
    	newSeq=""
    	for lettre in seq :
    		if(lettre=='['):
    			inMotif=True
     
    		if(inMotif==True):
    			motif=motif+lettre
    		else:
    			newSeq=newSeq+lettre
     
    		if(lettre==']'):
    			newSeq=newSeq+str(iupacdict.get(motif))
    			inMotif=False
    			motif=""
    	newSeqs.append(newSeq)
    Ce n'est pas très joli c'est sûr, et un peu plus long mais ça reste fonctionnel. Je garde en mémoires vos deux méthodes respectives et je les utiliserai assez rapidement je pense.

    Merci pour votre disponibilité en tout cas, je pense que nous aurons l'occasion d'échanger à nouveau, j'ai lu quelques uns de vos nombreux messages sur le forum.

    Bonne suite et merci à nouveau,

    Emmanuel.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/02/2015, 10h33
  2. [WD11] Remplacement des caractéres à partir d'un Fichier .FIC
    Par hanitax dans le forum WinDev
    Réponses: 5
    Dernier message: 12/01/2012, 14h58
  3. [WD-2002] Rechercher/remplacer des chaînes à partir d'un tableau à deux colonnes
    Par LondonLondres dans le forum VBA Word
    Réponses: 2
    Dernier message: 28/11/2011, 00h15
  4. Fonction permettant de remplacer des caractères
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 06/09/2004, 15h48
  5. Charger des paramètres à partir de beans
    Par lalakers dans le forum ANT
    Réponses: 1
    Dernier message: 19/05/2004, 18h25

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