Liste verification

Résolu
Bonjour,
je cherche un moyen pour vérifier que les occurrence d'une liste appartienne bien a une autre liste
ex:
lst1 = [1,2,3,4,5,6,7,8,9]
lst2 = [1,5,8]
pour que si les élements de lst2 sont dans lst1 il me return True

12 réponses

  1. Pour vérifier l'appartenance d'un groupe d'éléments dans une liste on peut utiliser all. C'est très efficace et court.

    def appartenance(lst1, lst2):
        return all(i in lst1 for i in lst2)


    "alors que je voudrais que l'utilisateur ne puisse se servir que d'une seul fois chaque élément de lst1 (choix lettres) dans lst2(choix du joueur)"

    Ce n'est pas le rôle de la fonction appartenance, il faut aussi réfléchir à la façon de concevoir la résolution d'un problème. Dans ton cas, il faut créer une fonction permettant d'enregistrer les valeurs dans une liste en vérifiant qu'elle n'était déjà pas présente auparavant.

    Ça pourrait être une fonction toute simple qui permettrait d'insérer une valeur dans une liste à condition que cette valeur ne soit pas déjà présente. Si elle est présente, la fonction retourne False, sinon True...

    def insert(valeur, liste):
        if valeur not in liste:
            liste.append(valeur)
            return True
        return False


    Ensuite utiliser cette fonction lors de la demande utilisateur afin d'entrer ses chiffres et ses lettres.
    1. cependant il me reste un problème, je suis en train de programmer le jeu des chiffres et des lettres mais dans cette vérification il regarde juste si l'élément existe dedans alors que je voudrais que l'utilisateur ne puisse se servir que d'une seul fois chaque élément de lst1 (choix lettres) dans lst2(choix du joueur)
      par exemple:
      lst1=[1,2,3,4,5,6]
      lst2=[1,2,4,4]
      j'aimerai qu'il me donne False
      1. comme ça, j'ai vraiment du mal avec cette fonction dsl :s
        def apartenance (lst1 , lst2) :
        	for c in lst2 :
        		if c not in lst1 :
        			return False
        	return True
        
        		
        
        lst = [1,2,3,4,5,6,7]
        lsttest = [1,4,6] 
        
        test = apartenance (lsttest,lst)
        print (test)
        1. Contributeur
          Bah c'est bien ça :-). Parfait.
          Ca ne te convient pas ?
        2. @fiddybah je l'avais fait comme ça au départ, mais quand je le test il me répond False .. :/
        3. @maxiximeje viens de trouver l'erreur, merci beaucoup, il faut juste inversée les deux lst1 et lst2
        4. Contributeur
          Ben, faut faire attention.
          Dans ton post initial, tu mets :
          lst1 = [1,2,3,4,5,6,7,8,9]
          lst2 = [1,5,8]
          pour que si les élements de lst2 sont dans lst1 il me return True

          Dans ce cas, il faut bien faire : for i in lst2

          Maintenant, si tu souhaites vérifier les éléments de lst1. Là oui, il faut bien mettre : for i in lst1.

          Cdlt,
      2. Contributeur
        Bonjour,

        Je remets ce que j'avais mis plus haut car, ça me paraît clair :-)
        Dès qu'un élément n'est pas dans la liste, il faut renvoyer False. S'ils sont tous dans la liste, donc à la fin de la boucle for, tu renvoies True.
        1. bonjours,
          je vois pas très bien ce que tu veux dire, la il est censé renvoyer False lorsque que un élement ne se trouve pas dans la seconde liste
          1. Oui, mais pas true dès qu'il en trouve un.
        2. Bonjour,

          Je ne connaissait pas l'instruction in (je ne fais pas de Python...).
          Mais dans ma première réponse, je t'ai dis de renvoyer Fasle dès qu'il manque une valeur et True quand toute la recherche est faite.

          Ce n'est pas ce que fait ton code.
          1. def apartenance (lst1 , lst2) :
            	for c in lst2 :
            		if c not in lst1 :
            			return False
            		else : 
            			return True	
            
            		
            
            lst = [1,2,3,4,5,6,7]
            lsttest = [1,4,9] 
            
            test = apartenance (lsttest,lst)
            print (test)


            je viens d'écrire ça mais le problème est qu'il me renvoi True, j'ai l'impression qu'il test uniquement le première éléments
            1. Bonjour, pense à utiliser le bouton répondre. Les commentaires servent plus à digresser sur une réponse
          2. ça ferais un truc du genre ?
            for i in lst1 :
            if i in lst2 :
            return True
            else :
            return False
            1. Contributeur
              Ca brûle, mais c'est pas tout à fait juste.
              Dès qu'un élément n'est pas dans la liste, c'est qu'il faut renvoyer False. S'ils sont tous dans la liste, donc à la fin de la boucle for, tu renvoies True.
              C'est plutôt for i in lst2 (et non lst1)

              Note : n'oublie pas de tenir compte de la remarque de whismeril sur la coloration syntaxique.
              Exemple :
              <code python>ici tu mets ton code</code>
          3. Contributeur
            Pas besoin d'une double boucle for.
            1/ Tu parcours la liste2
            2/ Tu renvoies False dès qu'un élément n'est pas dans liste1 (opérateur in).
            3/ Sinon, tu renvoie True
            1. oui c'est ce que j'ai pensé faire mais impossible d'écrire quelque chose qui fonctionne, mon programme vérifie uniquement la première donnée de lst2
              1. Bonsoir,

                Une boucle parcoure les données de list2.
                Pour chaque valeur (V) de list2, une seconde boucle parcoure List1 pour comparer à V.
                A la première absence, tu sors des deux boucles et retourne False.
                Si tu trouve tout, tu retournes True