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 :

comparaison 3 éléments successifs d'une liste


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut comparaison 3 éléments successifs d'une liste
    Mon problème est le suivant:
    Je dois comparer des éléments d'une liste et retourner true si 3 éléments successif de cette liste sont des mots

    Exemple
    si j'ai la liste l=["un","homme","2","méchant"] alors je dois retourner False
    si j'ai la liste l=["un","homme","méchant","2"] alors je dois retourner true
    si j'ai la liste l=["un","1","homme","méchant","de"] alors je dois retourner true

    Voila mon programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def checkio(words):
        words_list = words.split(" ")
        if len(words_list) > 2: 
            for i, x in enumerate(words_list):
                if words_list[i].isalpha() == words_list[i+1].isalpha() == words_list[i+2].isalpha():
                    return True
                else:
                    return False        
        else:
            return False
    Ce programme ne fait la comparaison que des 3 premiers éléments de la liste et je sais pas comment faire autrement svp.....merci

    le savoir vient en s'exerçant

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Essaye de mettre un continue dans le else, ou alors pas de else.

  3. #3
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Salut,

    Pour commencer, utilise la balise # pour poster du code, sinon c'est illisible. ET en general on evite le langage sms (je fais reference au "g").

    Passé cela, il faut utiliser le principe du registre à decalage. JE m'explique: tu remplis un registre (peut etre trois variable, liste, ..., mais en general une liste, on va partir la dessus).

    considerons que tu dois verifier une liste [element0, element1, element2, ..., elementn]

    Tu remplis donc ta liste [element0, element1, element2], puis tu teste avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if type(listing[0]) == type("str") and type(listing[1] == type("str") and type(listing[2]) == type("str"):
        print("True")
    else:
        print("False")
    Ensuite tu decale ton registre avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    del(listing[0]) #apres, listing[0] ne sera plus element0 mais element1 ...
    listing.append(element_suivant)
    et tu reprend la comparaison. Tu fais cela tant que tu n'a pas atteint la fin de ton fichier

  4. #4
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par deusyss Voir le message
    Passé cela, il faut utiliser le principe du registre à decalage. JE m'explique: tu remplis un registre (peut etre trois variable, liste, ..., mais en general une liste, on va partir la dessus).
    Bonjour,
    Et pourquoi pas simplement parcourir tout en maintenant un compteur à jour?

    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
    >>> lst = [1, 2, "Coucou", 4, 5, 6, "dernier"]
    >>> cpt = 0
    >>> mon_type = ""
    >>> for elm in lst:
    	if mon_type == type(elm):
    		cpt += 1
    	else:
    		mon_type = type(elm)
    		cpt = 1
    	if cpt == 3:
    		print(True)
     
     
    True
    >>>
    Clodion

  5. #5
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    C'est effectivement une autre solution, il n'y en a jamais une seule et unique.

  6. #6
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonjour,
    Oui, toujours plusieurs solutions.
    Par contre pour la réponse complète:
    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
    def checkio(words):
        words_list = words.split()
        for ind, elm in enumerate(words_list):
            if elm.isdigit():
                words_list[ind] = int(elm)
        cpt = 0
        mon_type = ""
        rep = False
        for elm in words_list:
            if mon_type == type(elm):
                cpt += 1
            else:
                mon_type = type(elm)
                cpt = 1
            if cpt == 3:
                rep = True
                break
        return rep
     
    print(checkio("un homme 2 méchant"))
    print(checkio("un homme méchant 2"))
    print(checkio("un 1 homme méchant de"))
    (parce que le premier problème est de comparer des nombres sous forme de texte!!)

    Ou bien:
    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
    def checkio1(phrase):
        mots = phrase.split()
        mots = [elm.isdigit() for elm in mots]
        cpt = 0
        mon_type = not mots[0]
        rep = False
        for elm in mots:
            if mon_type == elm: cpt += 1
            else:
                mon_type = elm
                cpt = 1
            if cpt == 3:
                rep = True
                break
        return rep
    Clodion

  7. #7
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonjour,
    Oui!! Pourquoi pas!!!
    Clodion

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    j'ai essayé le code suivant à mon cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    lst = [1, 2, "Coucou", 4, 5, 6, "dernier"]
    cpt = 0
    mon_type = ""
    for elm in lst:
        if mon_type == type(elm):
    		cpt += 1
    	else:
    		mon_type = type(elm)
    		cpt = 1
    	if cpt == 3:
    		print(True)
    mais ce programme ne prend pas en compte que les 3 mots consécutifs d'une liste, il prend aussi en compte les chiffres??

  9. #9
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par kali38 Voir le message
    j'ai essayé le code suivant à mon cas:
    mais ce programme ne prend pas en compte que les 3 mots consécutifs d'une liste, il prend aussi en compte les chiffres??
    Bonjour,
    Oui parce qu'il s'intéresse aux types…
    Sinon, c'est encore plus simple!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def checkio1(phrase):
        mots = [not elm.isdigit() for elm in phrase.split()]
        cpt = 0
        for elm in mots:
            cpt = (cpt + 1 if elm else 0)
            if cpt == 3: break
        return cpt == 3
    Clodion

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Oui c'est parfaitement clair, merci bcp

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur en formation
    Inscrit en
    Juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 300
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def checkio(words):
        i=0
        if len(words)<=2 : return False  #pour plus de lisibilité
        while i < len(words)-2 :
                if words[i].isalpha() == words[i+1].isalpha() == words[i+2].isalpha():
                    return True
                i+=1
        return False

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/09/2019, 22h36
  2. Réponses: 9
    Dernier message: 04/05/2007, 15h48
  3. [Débutant] copier l'élément sélectionner dans une liste
    Par Henry9 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/04/2007, 21h49
  4. Modifier élément sélectionné d'une liste
    Par DevloNewb' dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/03/2007, 15h35

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