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 :

Soucis d'algo chaine de caractère


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Par défaut Soucis d'algo chaine de caractère
    Bonjour à tous,

    voila je suis bloqué depuis déjà un bon moment sur une question d'algo, je voudrais récupérer le dernier caractère d'une chaine de caractère qui en contient plusieurs occurences, exemples: je veux récupérer le dernier caractère "(", soit celui qui est en rouge dans l'exemple "((...))..()"


    Voici 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    seq="AUCGUCGAUC"
     
    struct="(()).(...)"
     
     
    if len(seq) != len(struct):
    	print('ERREUR LA SEQUENCE ET LA TAILLE DU MOTIF DOIVENT AVOIR LA MEME TAILLE')
    	print('\n')
    	print('La sequence a une taille de :', len(seq))
    	print('La structure a une taille de :', len(struct))
    	print ('\n')
     
    x=' '
     
    First=0
    i=0
    j=0
    LastPosition=0
     
    for i, el in enumerate(struct):
    	while (el=='(') and  (i <= len(struct)):
    			LastPosition=i
     
    			#struct = struct.replace(el," ")
    			break	
     
    print ('Le dernier ( est a la position : ', LastPosition)
     
    for LastPosition, el in enumerate(struct):
    		if el==')':
    			First = LastPosition
     
    			#struct = struct.replace(el," ")
    print ('Le premier ) est a la position : ',First)
     
    print struct

    Dans la première partie du code j'arrive à récupérer la position du dernier élement et à l'afficher en la stockant dans ma variable "LastPosition", mais je voudrais récupérer le caractère (et non la position), car je voudrais supprimer ce caractère apres l'avoir récupérer, si je fais un struct = struct.replace('(', "") je vais supprimer toutes les occurences de '(', voila pourquoi je voudrais récupérer ce caractère pour le supprimer ensuite. J'espère que c'est pas trop flou

    Merci à vous

  2. #2
    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,

    Tout d'abord, tu peux parcourir une chaine (ou liste) en sens descendant.

    >>> for i in range(len(ch)-1, 0, -1):
    ... print ch[i]
    ...
    f
    e
    d
    c
    b
    Ensuite tu veux connaitre le caractère et non sa position or ton code dit que tu cherches un caractère spécifique, que tu connais déjà donc.

    ???

    En tout état de cause, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    caractère = struct.pop(i)
    ce qui aura pour effet de supprimer le caractère en question et tu le récupéreras dans ta variable 'caractère'.

    Non ?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par VinsS Voir le message
    En tout état de cause, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    caractère = struct.pop(i)
    ce qui aura pour effet de supprimer le caractère en question et tu le récupéreras dans ta variable 'caractère'.

    Non ?
    un pop() sur un string ???

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Eh eh, non, pas de (pape du) pop en string (puisqu’elles sont immutable…)

    Par contre, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct = "".join((struct[:i], struct[i+1:]))
    …suffit à se débarrasser de l’importun caractèr(i)e(l)

  5. #5
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Bonjour,
    - Si on se fiche de connaitre i:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct = ''.join(struct.rsplit('(', 1))
    épicétou.

    - Si on veut également i:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cut = struct.rsplit('(', 1)
    i, struct = len(cut[0]), ''.join(cut)

  6. #6
    Membre Expert 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
    Par défaut pop pop pidou
    Ben oui pop...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> struct = "(()).(..a.)"
    >>> l = list(struct)
    >>> l.pop(struct.rfind('a'))
    'a'
    >>> struct = ''.join(l)
    >>> struct
    '(()).(...)'
    Bon.. Ok --->[]

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Par défaut
    Bonjour à tous et merci pour vos réponses,

    En fait je veux récupérer les couples de parenthèses (), garder la position en mémoire, et stocker le caractère pour le supprimer par la suite, car mon but final est de récupérer tous les couples (), seulement je réfléchis a un algo pour récupérer les bon couples, un peu comme dans un calcul mathématique complexe il faut associer les bonnes parenthèses entres elles, bref c'est comme ça que j'ai raissoné, je récupère la dernière parenthèse ouvrante, puis je fais une boucle a partir de la position ou j'ai trouvé la dernière parenthèse ouvrante pour trouver la première parenthèse fermante ( qui sera forcémment la bonne, formant ainsi le bon couple), ensuite je les supprime et je voudrais réitéré jusqu'a les avoir toutes récupétrés, j'espère que c'est plus clair


    J'ai essayé vos astuces et ca marche pour ma seconde boucle, mais pour la 1ere je supprime toutes les occurences de la parenthèse ouvrante :/ Voici le code actuel :

    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
    seq="AUCGUCGAUC"
     
    struct="(()).(...)"
     
     
    if len(seq) != len(struct):
    	print('ERREUR LA SEQUENCE ET LA TAILLE DU MOTIF DOIVENT AVOIR LA MEME TAILLE')
    	print('\n')
    	print('La sequence a une taille de :', len(seq))
    	print('La structure a une taille de :', len(struct))
    	print ('\n')
     
    x=' '
     
    First=0
    i=0
    j=0
    LastPosition=0
     
    for i, el in enumerate(struct):
    	while (el=='(') and  (i <= len(struct)):
    			LastPosition=i
     
     
    			#struct = struct.replace(el," ")
    			break	
     
    print ('Le dernier ( est a la position : ', LastPosition)
     
    for LastPosition, el in enumerate(struct):
    		if el==')':
    			First = LastPosition
    			x = el
    			struct = "".join((struct[:i], struct[i+1:]))
    print ('Le premier ) est a la position : ',First)
     
    print struct
    print x

    PS : en fait la condition de la boucle est nulle, je n'arrive pas a récupérer que la dernière parenthèse ouvrante, je les récupère toute.

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    donnes un exemple d'input/output (j'ai ça en entrée, je veux ça en sortie).
    j'ai l'impression que tu veux faire une sorte d' "ordre de priorité", mais c'est pas clair ...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Par défaut
    En entrée j'ai une séquence avec un alphabet seq='AUCGC'

    et une structure correspondante a ma sequence, struct='().()'

    En sortie je veux :

    A C G
    | . __|
    U _ C


    l'affichage bug je suis pas doué... le A est en face du U relié par un '|', le C est seul, il y a juste un '.' sur la seconde ligne, et enfin le G est lié au C par un '|'.


    en fait je veux lier les lettres en elles (en fonction de l'agencement des parenthèses), lorsque qu'un point apparait cela signifie qu'il n'y a pas d'appariment. Voila le résultat final que j'aimerais en sortie.

  10. #10
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Je suis comme josmiley, je ne comprends pas trop le but du jeu. Peut-être le premier problème est-il de trouver les couples de parenthèses de même rang, et ce qu'il y a entre ? C'est alors un problème assez classique. Dans Google, avec python, vous ajoutez parenthesis matching (ou appairage parenthèses). Vous aurez des solutions le plus souvent regex.
    Une idée pour un algo classique: à partir d'une '(', vous initialisez une variable à 0, vous faites +1 pour chaque '(' rencontré, et -1 pour chaque ')'. La ')' correspondante est la première rencontrée avec la variable à 0.

    Remarque: il est utile pour poster un problème de faire un embryon de cahier des charges. D'ailleurs le plus souvent en le rédigeant on répond soi-même à la question avant de la poser...

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    avec ça ça donnerait quoi ?

    seq="AUCGUCGAUC"

    struct="(()).(...)"

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Par défaut
    Oui ok je vais essayer de poser un peu plus les choses ca semble bien plus compliqué que je ne pensais.

    avec ça ça donnerait quoi ?

    seq="AUCGUCGAUC"

    struct="(()).(...)"
    Pour une question de lisibilité je vais présenter le résultat horizontalement:

    A --- G
    U --- C
    U .
    C --- C
    G .
    A .
    U .

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    l'ordre a une importance ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Par défaut
    Oui la séquence finale doit respectée l'ordre d'apparition des parenthèses, comme dans l'exemple.

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    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
    seq=bytearray("AUCGUCGAUC")
     
    struct=bytearray("(()).(...)" )
     
    out = []
     
    while seq:
        if chr(struct[0]) == '.':
            out.append(chr(seq.pop(0)))
            struct.pop(0)
        elif chr(struct[0]) == '(':
            idx = 1
            for e,i in enumerate(struct[1:]):
                if chr(i) == '(':
                    idx+=1
                elif chr(i) == ')': idx-=1
                if not idx: break
            out.append((chr(seq.pop(0)),chr(seq.pop(e))))
            struct.pop(0)
            struct.pop(e)
     
    print out
     
    [('A', 'G'), ('U', 'C'), 'U', ('C', 'C'), 'G', 'A', 'U']

    bon, c'est crade ...
    j'a fait ça vite fait ...
    en gros, tu scannes tes deux chaines en même temps, si t'as un '.', tu retires la lettre correspondante ainsi que le '.', si t'as un '(' tu retires la lettre correspondante et le '(' AINSI QUE le ')' correspondant et la lettre qui y correspond ...
    ça fait pas mal de correspondance.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Par défaut
    Je vais tester ça, merci d'avoir pris de votre temps c'est vraiment sympa

    Ce code nécessite t'il l'importation d'une librairie spécifique ? j'obtiens le message d'erreur suivant lorsque je tente de l'executer :

    "NameError: name 'bytearray' is not defined"

  17. #17
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par Thomas77380 Voir le message
    Je vais tester ça, merci d'avoir pris de votre temps c'est vraiment sympa

    Ce code nécessite t'il l'importation d'une librairie spécifique ? j'obtiens le message d'erreur suivant lorsque je tente de l'executer :

    "NameError: name 'bytearray' is not defined"
    ça dépend peut-être de la version de python ... j'ai 2.7.

  18. #18
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    La solution de josmiley me semble parfaite – c’est aussi l’algorithme que j’aurais utilisé. Par contre, pourquoi utiliser bytearray, qui en plus oblige à systématiquement reconvertir en chr ?

    Voici une version avec list, testée sous 2.6 :

    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
    seq = list("AUCGUCGAUC")
     
    struct = list("(()).(...)")
     
    out = []
     
    while seq:
        if struct[0] == '.':
            out.append(seq.pop(0))
            struct.pop(0)
        elif struct[0] == '(':
            idx = 1
            for e,i in enumerate(struct[1:]):
                if i == '(':
                    idx += 1
                elif i == ')':
                    idx -= 1
                if not idx: break
            out.append((seq.pop(0), seq.pop(e)))
            struct.pop(0)
            struct.pop(e)
     
    print out
     
    [('A', 'G'), ('U', 'C'), 'U', ('C', 'C'), 'G', 'A', 'U']
    PS : Thomas, c’est quoi comme ADN, et à quoi correspond ce regroupement ?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Par défaut
    ça fonctionne merci , je vais regarder tout ça en détail maintenant.


    PS : Thomas, c’est quoi comme ADN, et à quoi correspond ce regroupement ?
    En fait ce sont des séquences d'ARN, et la structure composée de point et de parenthèses est obtenue suite à l'execution de logiciel de prédiction de structure secondaire d'ARN (c''est à dire le repliement de la molécule d'ARN, d'où cette notion d'appariement). Je ne travail pas sur un regroupement particulier en fait je dois pouvoir matérialiser graphiquement ces structures secondaires d'ARN à partir de n'importe quelles séquences / structures.

    Voici un lien vers un logiciel, ce sera sûrement plus parlant :
    http://varna.lri.fr/demo.html


    EDIT : en fait je suis biologiste de formation et comme vous avez pu le constater mes compétences en programmation sont assez faibles, je ne connais pas trop les listes en python (encore moins que les chaines de caractères c'est dire...) mais à votre avis est'il possible de manipuler cet algo pour avoir un affichage vertical ? car là les appariements sont parfaits, c'est juste le rendu graphique qui pose "problême", j'aimerai obtenir quelque chose qui ressemble à peu près ca :


    c agg gagguag gguuguau
    | ||| ||||||| ||||||||||| || ||
    g uuu uuccauu ccaaca

    je voudrais juste savoir si c''est faisable en manipulant des listes ?

  20. #20
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par mont29 Voir le message
    La solution de josmiley me semble parfaite – c’est aussi l’algorithme que j’aurais utilisé. Par contre, pourquoi utiliser bytearray, qui en plus oblige à systématiquement reconvertir en chr ?

    Voici une version avec list, testée sous 2.6 :

    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
    seq = list("AUCGUCGAUC")
     
    struct = list("(()).(...)")
     
    out = []
     
    while seq:
        if struct[0] == '.':
            out.append(seq.pop(0))
            struct.pop(0)
        elif struct[0] == '(':
            idx = 1
            for e,i in enumerate(struct[1:]):
                if i == '(':
                    idx += 1
                elif i == ')':
                    idx -= 1
                if not idx: break
            out.append((seq.pop(0), seq.pop(e)))
            struct.pop(0)
            struct.pop(e)
     
    print out
     
    [('A', 'G'), ('U', 'C'), 'U', ('C', 'C'), 'G', 'A', 'U']
    PS : Thomas, c’est quoi comme ADN, et à quoi correspond ce regroupement ?
    comme j'ai dit plus haut, j'ai pondu ça vite fait; j'ai fait une sieste et en me réveillant je me suis dit "mais chui trop c**" ... trop tard. ^^

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Réponses: 0
    Dernier message: 20/12/2011, 06h55
  3. Comparer deux chaine de caractères (vérification de mon algo svp)
    Par beegees dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 09/10/2007, 01h10
  4. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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