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 :

problème vérifier si plusieurs élements appartiennent à une liste


Sujet :

Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut problème vérifier si plusieurs élements appartiennent à une liste
    Bonjour tout le monde, j'ai un travail pour l'unif où je dois créer un boggle (http://fr.wikipedia.org/wiki/Boggle).
    Tout d'abord j'ai générer une grille (4x4) nommé grid qui contient des lettres au hasard. Ensuite, je dois créer une fonction qui vérifie que toutes les lettres du mot(word) que l'utilisateur a rentré est dans grid.
    J'ai donc écris :
    def word_on_board(word,grid) :
    for char in word :
    if char in grid :
    return True
    else :
    return False
    (je n'arrive pas à faire les indentations sur le forum)
    Mais le soucis c'est que si ma première lettre est dans grid, ma fonction va s'arrêter. Je dois donc essayer de faire une fonction qui vérifie que toutes les lettres soient dedans et qui s'arrête dès qu'une lettre n'est pas dedans. Sauriez vous m'aider ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Salut,
    Pour indenter le code et le rendre plus lisible, pensez a utiliser le # qui est dans le menu du mode d’édition des messages.

    Ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def word_on_board(word,grid) :
         for char in word :
              if char in grid :
                  return True
              else :
                  return False
    Je dois donc essayer de faire une fonction qui vérifie que toutes les lettres soient dedans et qui s'arrête dès qu'une lettre n'est pas dedans. Sauriez vous m'aider ?
    Python contient des fonctions magiques pour faire ca en une ligne, mais comprendre ce qu'on fait pas a pas avant de les utiliser permet d'apprendre a programmer.
    Allons y a pied...

    "qui s'arrête dès qu'une lettre n'est pas dedans"
    En gros, c'est sortir de la boucle ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            if char not in grid:
                return False
    Et lorsqu'on a fini la boucle, c'est que tous les caracteres sont "bons":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for char in word :
            .... le block du bout de code precedent
        return True
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    Mais donc cela ne change pas grand chose à ma fonction. On a inversé un return false et un return true car on a mis un "not in" à la place d'un "in".
    Sinon j'ai pensé à une autre manière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def word_on_board(word,grid)	:
    	x=0
    	condition=False 
    	while word[x] in grid:
                x=x+1
                if x==len(word)-1:
                    condition=True
     
    	return condition
    Je ne sais pas si elle est juste

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Salut,
    Je ne sais pas si elle est juste
    Elle est juste si elle "fonctionne" et qu'elle retourne le résultat espéré.
    J'ai compris que:
    • word_on_board('abc', 'cdbea') devait retourner True, et
    • word_on_board('abx', 'cdbea') devait retourner False


    Pour l'instant, lancez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def word_on_board(word,grid)	:
    	x=0
    	condition=False 
    	while word[x] in grid:
                x=x+1
                if x==len(word)-1:
                    condition=True
     
    	return condition
     
    print (word_on_board('abc', 'cdbea'))
    print (word_on_board('abx', 'cdbea'))
    Vous aurez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "<stdin>", line 18, in <module>
      File "<stdin>", line 10, in word_on_board
    IndexError: string index out of range
    Avec la fonction que j'ai propose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def word_on_board(word, grid):
        for c in word:
            if not c in grid:
                return False
        return True
    Ca sort:
    Ce n'est peut être pas ce que vous voulez mais c'est un autre sujet.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Tu peux simplifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        for w in word:
            if w not in board:
                return False
        return True

    Et si tu peux utiliser les set:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def word_on_board(word, board):
        word = set([w for w in word])
        return word.issubset(set(board))
     
    grid = ['a', 'b', 'n', 'k', 'l', 'h', 'o', 'g', 'i', 'r']
    print(word_on_board('klr', grid))
    print(word_on_board('ogh', grid))
    print(word_on_board('zvf', grid))

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Certes!
    Et pourquoi pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    word_on_board = lambda w, g: set(w) <= set (g)
    mais je ne suis pas certain que cela aide le PO a se dépatouiller mieux cote test de conditions et boucle for...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    J'ai essayé vos codes mais ca ne marche pas car lorsqu'on doit chercher si toutes les lettres sont dans ma matrice (grid) qui contient 16 lettres. Dès que je trouve une lettre de mon mot qui se trouve dans grid, je ne peux réutiliser cette lettre.
    Donc faudrais essayer de supprimer la lettre temporairement de grid, le temps qu'on continue à vérifier les autres lettres.
    Par exemple:
    word = papier
    grid =
    a b c e
    i r t v
    p w y z
    m n q u
    Ma fonction est censé me dire que le mot n'est pas dans la grille car il y'a un qu'un seul p.
    Ca fait quelques jours que je bloque la-dessus :/
    Merci de votre aide en tt cas

  8. #8
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Je remercie wiztricks qui me rappelle qu'une string peut se transformer en set sans passer par une liste ....


    Pour ton problème, tu peux faire un remove() sur ta grille, en utilisant une copie pour la préserver bien sur.

    Quequ'chose comme ç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
     
    def eval_word(board, text):
        for t in text:
            if t in board:
                board.remove(t)
            else:
                return False
     
        return True
     
    grid = "a b c e i r t v p w y z l r n q u".split(' ')
    # On travaille sur une copie de grid
    grid2 = grid[:]
    print(eval_word(grid2,  "papier"))
    grid2 = grid[:]
    print(eval_word(grid2,  "palier"))
    grid2 = grid[:]
    print(eval_word(grid2,  "ralier"))

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/10/2013, 12h13
  2. Réponses: 3
    Dernier message: 03/11/2011, 11h04
  3. Réponses: 1
    Dernier message: 25/05/2011, 07h16
  4. Saisie de plusieurs caractère dans une liste déroulante
    Par Oluha dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/03/2005, 14h32
  5. plusieurs value dans une liste deroulante
    Par lepierre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 16/11/2004, 14h53

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