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

  1. #1
    Nouveau Candidat au Club
    extraire des sous listes d'une liste en utilisant un critère de discontinuité des valeurs de la liste..
    Bonjour à tous !
    Je suis débutante en Python et j'ai besoin d'un petit coup de main..

    j'ai un logiciel qui m'extrait des données sous forme de chaine de caractères comme ci dessous :

    oooooooooooooooooooooooooooooooooooooooooooooooooooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiMMMMMMMMMMMMMMMMMMMMMooooooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMMMMMMMMMMMMMMMMMMMMMoooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
    Je souhaiterai transformer cette chaine de caractères afin de ne garder que les positions de départ et fin des groupes de lettres M : liste en sortie du type [[56,76],[85,105]….]

    J'ai écrit le code suivant :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    """renvoyer les position de la lettre M dans la liste TM """
    trouver = lambda mot, lettre: [i for i, car in enumerate(mot) if car==lettre]
    TM=  trouver(text, 'M')
     
    """ajouter +1 à chaque valeur de la liste TM pour connaitre la position"""
    TMc=[]
    for item in TM :    
       TMc.append(item +1)
       TMc  
    print(TMc)


    j'obtiens la liste suivante :

    [56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246]
    je voudrais maintenant découper la liste en autant de sous listes qu'il y a de groupes continus mais là je suis bloquée j'ai essayer différentes choses mais sans résultats

    Help.... je vous remercie

  2. #2
    Expert éminent sénior
    Salut,

    Citation Envoyé par CheresRose Voir le message
    je voudrais maintenant découper la liste en autant de sous listes qu'il y a de groupes continus mais là je suis bloquée j'ai essayer différentes choses mais sans résultats

    Si vous balayez la chaîne de caractères s = 'aaabbbbccccc', les suites de caractères identiques vérifient caractère précédent identique au caractère courant.
    Et une discontinuité se traduira par caractère précédent différent du caractère courant.

    Ce qui se code (par exemple) avec:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> s = 'aaabbbbccccc'
    >>> lastch = s[0]
    >>> for i in range(len(s)):
    ...     if lastch != s[i]:
    ...        print(i)
    ...        lastch = s[i]
    ...
    3
    7


    A adapter en fonction de ce que vous cherchez à obtenir.

    Et si vous débutez avec Python, c'est le genre de construction qu'on apprend à faire avec n'importe quel tuto.
    (et si vous avez ouvert un tuto. et que vous n'avez pas retenu comment faire ce genre de petit code là, vous avez intérêt a y passer du temps car tout va être compliqué).

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

  3. #3
    Membre régulier
    Salut,
    et si tu faisais "si (n+1 - n) > 1 alors mon groupe est fini", donc tant que c'est =1 la suite est continue donc j'écris dans la liste n.
    C'est un peu ce sur quoi je bricole là https://www.developpez.net/forums/d2085324/general-developpement/algorithme-mathematiques/traitement-signal/detection-paliers/#post11587340.

    Bon le code casse pas des patates, mais le principe est là, à mon sens. puis je suis pas sur de comprendre ta demande de traitement qui change, tu commence par les valeurs de position de départ et de fin pour donner un code et une demande sur une liste continue? Peut être est ce deux traitement différent ?

  4. #4
    Expert éminent
    salut,

    Citation Envoyé par CheresRose Voir le message
    Je souhaiterai (...) ne garder que les positions de départ et fin des groupes de lettres M : liste en sortie du type [[56,76],[85,105]….]
    une méthode possible avec des regex :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    import re
    TMC = [[i.start(), i.end()] for i in re.finditer(r'M+', text)]


    et le résultat :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    [[55, 76], [84, 105], [115, 136], [197, 218], [225, 246]]

  5. #5
    Membre habitué
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Ce qui se code (par exemple) avec:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> s = 'aaabbbbccccc'
    >>> lastch = s[0]
    >>> for i in range(len(s)):
    ...     if lastch != s[i]:
    ...        print(i)
    ...        lastch = s[i]
    ...
    3
    7

    Oh c'est élégant, cette façon de faire !

    Quant à moi voici ma proposition :
    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
    text = """oooooooooooooooooooooooooooooooooooooooooooooooooooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiMMMMMMMMMMMMMMMMMMMMMooooooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMMMMMMMMMMMMMMMMMMMMMoooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii """
     
     
    def get_list(txt,letter):
            liste = []
            id, first, second = 0,0,0
            for l in txt:
                    if l == letter and txt[id-1]!=letter:
                            first = id+1
                    elif l == letter and txt[id+1]!=letter:
                            second = id+1
                    elif l!=letter and first+second:
                            liste.append([first,second])
                            first, second = 0,0
                    id+=1
            print(liste)


    Résultat :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >>> get_list(text,"M")
    [[56, 76], [85, 105], [116, 136], [198, 218], [226, 246]]

  6. #6
    Membre habitué
    Citation Envoyé par BufferBob Voir le message

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    import re
    TMC = [[i.start(), i.end()] for i in re.finditer(r'M+', text)]

    Oh ! Magnifique !

    Je rajouterais :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    ]import re
    TMC = [[i.start()+1, i.end()+1] for i in re.finditer(r'M+', text)]


  7. #7
    Membre actif
    Citation Envoyé par LeNarvalo Voir le message
    Oh ! Magnifique !

    Je rajouterais :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    ]import re
    TMC = [[i.start()+1, i.end()+1] for i in re.finditer(r'M+', text)]

    Bonjour,
    Je laisserai plutôt le code de Bufferbob tel qu'il est ..

    à moins que l'on souhaite la 2eme borne correspond aux derniers M rencontré.
    Dans ce cas ce serait plutôt:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    TMC = [[i.start(), i.end()-1] for i in re.finditer(r'M+', text)]

  8. #8
    Nouveau Candidat au Club
    Super ,
    j'ai testé 2 façons de faire qui fonctionnent ! merci à tous !

    bonne journée

  9. #9
    Expert éminent sénior
    Bonjour
    Citation Envoyé par BufferBob Voir le message
    une méthode possible avec des regex
    Héhé, t'aimes bien les regex toi. Partout où tu passes tu nous mets une regex. "je voudrais parcourir un graphe" "ok, pas de souci, voici une regex qui te fait ça".

    Ceci dit, ta solution est superbe
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  10. #10
    Rédacteur

    Citation Envoyé par LeNarvalo Voir le message
    Oh ! Magnifique !

    Je rajouterais :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    ]import re
    TMC = [[i.start()+1, i.end()+1] for i in re.finditer(r'M+', text)]



    S'il fallait changer quelque chose à la belle solution de @BufferBob, j'écrirais :

    Code Python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    text = "oooooooooooooooooooooooooooooooooooooooooooooooooooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiMMMMMMMMMMMMMMMMMMMMMooooooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMMMMMMMMMMMMMMMMMMMMMoooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
     
    tmc = [[i.start(), i.end()-1] for i in re.finditer(r'M+', text)]
     
    for lst in tmc:
        print(text[lst[0]], text[lst[1]])
     
    """
    M M
    M M
    M M
    M M
    M M
    """

  11. #11
    Membre actif
    Bonjour,
    Citation Envoyé par danielhagnoul Voir le message


    S'il fallait changer quelque chose à la belle solution de @BufferBob, j'écrirais :

    +1
    <sourire> (voir ma réponse en #7)

  12. #12
    Expert éminent
    Citation Envoyé par Sve@r Voir le message
    Héhé, t'aimes bien les regex toi. Partout où tu passes tu nous mets une regex. "je voudrais parcourir un graphe" "ok, pas de souci, voici une regex qui te fait ça".
    haha je me suis dit la même après avoir posté, je suis devenu promoteur regex

  13. #13
    Expert confirmé
    Bonsoir,

    Il y a aussi la possibilité d'utiliser groupby du module itertools.

    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
    In [1]: from itertools import groupby                                          
     
    In [2]: test = "oooooooooooooooooooooooooooooooooooooooooooooooooooooooMMMMMMMM
        ...: MMMMMMMMMMMMMiiiiiiiiMMMMMMMMMMMMMMMMMMMMMooooooooooMMMMMMMMMMMMMMMMMMM
        ...: MMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMMMMMMMM
        ...: MMMMMMMMMMMMMoooooooMMMMMMMMMMMMMMMMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
        ...: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
        ...: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
        ...: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
        ...: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"               
     
     
    In [3]: v = 0                                                                  
     
     
    In [4]: for group in 
    [list(g) for k, g in groupby(test)]: 
        ...:     v += len(group) 
        ...:     print(v) 
        ...:                                                                        
    55
    76
    84
    105
    115
    136
    197
    218
    225
    246
    544
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  14. #14
    Expert éminent sénior
    Citation Envoyé par fred1599 Voir le message
    Il y a aussi la possibilité d'utiliser groupby du module itertools.
    N'essaye pas. Quoi que tu fasses, tu ne pourras pas être plus concis et plus élégant que la solution de BufferBob. Moi j'ai même pas tenté.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  15. #15
    Expert confirmé
    Citation Envoyé par Sve@r Voir le message
    N'essaye pas. Quoi que tu fasses, tu ne pourras pas être plus concis et plus élégant que la solution de BufferBob. Moi j'ai même pas tenté.
    J'aime bien lutter contre les regex même si c'est peine perdue...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

###raw>template_hook.ano_emploi###