Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher des indices multiples d'une liste

Sujet résolu
    15 février 2016 à 22:52:37

    Bonjour à tous,

    Je bricolais récemment un petit programme pour un TD, tout allait bien, jusqu'à ce que je rencontre un problème.

    Le but du programme consiste à rechercher une valeur d'une liste sans l'utilisation de index(), et d'afficher son rang. Cependant, dans la liste, il existe plusieurs valeurs identiques qui ont néanmoins des indices de position différents. Je suis censé trouver un moyen pour afficher tous les rangs de ces valeurs identiques, mais je n'ai rien trouvé jusque là.

    Voici mon code:

    liste = [100, 98, 94, 92, 91, 90, 88, 82, 81, 81, 81, 78, 75, 72, 65, 64, 63, 52, 50, 48, 35, 34, 32, 31, 28, 26, 25, 21, 20, 19, 16, 15, 15, 14, 13, 12, 10, 5, 4, 2, 0]
    
    def recherche(t):
        r = float(input("Saisir la valeur de l'élément à rechercher:" ))
        d = 0
        f = 40
        trouve = False
        while trouve == False and d<=f:
            m = int((d+f)/2)
            if t[m] == r:
                trouve = True
            elif t[m] >= r:
                d = m+1
            else:
                f = m-1
    
        if trouve == True:
            print("L'élément recherché", r, " a été trouvé au rang", m, ".")
        else:
            print("L'élément recherché", r, "n'existe pas.")
    

    Pouvez-vous m'aider? Je dois afficher tous les rangs de la valeur 81.

    Merci d'avance,

    -
    Edité par Sunnymoon 15 février 2016 à 22:53:18

    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2016 à 23:14:42

      Ben pourquoi faire compliqué quand on peut faire simple? ^^

      liste = [100, 98, 94, 92, 91, 90, 88, 82, 81, 81, 81, 78, 75, 72, 65, 64, 63, 52, 50, 48, 35, 34, 32, 31, 28, 26, 25, 21, 20, 19, 16, 15, 15, 14, 13, 12, 10, 5, 4, 2, 0]
      
      elt = 81
      print([i for i in range(len(liste)) if liste[i] == elt])#[8, 9, 10]
      
      #ou bien si on veut faire propre:
      
      def recherche(liste, elt):
          liste_indices = []
          for i in range(len(liste)):
              if liste[i] == elt:
                  liste_indices.append(i)
          return liste_indices



      • Partager sur Facebook
      • Partager sur Twitter
        16 février 2016 à 10:36:35

        C'est vrai que c'est plus simple, le problème, c'est que au départ l'algorithme était clairement défini sur papier, et je devais le retranscrire en Python. Maintenant, je n'ai pas le droit de changer sa structure, seulement d'ajouter des trucs pour améliorer la fonction recherche comme je l'ai décrit.

        Néanmoins, le code que tu m'as donné est intéressant, en plus il utilise la récursivité. Je vais tenter de l'intéger à mon code.

        -
        Edité par Sunnymoon 16 février 2016 à 11:35:28

        • Partager sur Facebook
        • Partager sur Twitter
          16 février 2016 à 11:25:44

          On peut faire plus propre en utilisant la fonction enumerate:

          def recherche(liste, elt_recherche):
              liste_indices = []
              for ind, elt in enumerate(liste):
                  if elt == elt_recherche:
                      liste_indices.append(ind)
              return liste_indices


          Cette fonction prend en argument un itérable, et renvoie des couples (indice, valeur). Par exemple, pour la chaîne "hello", on va avoir:

          (0, "h")
          (1, "e")
          (2, "l")
          (3, "l")
          (4, "o")


          C'est LA manière propre quand on itère sur un objet dont on veut avoir ET les éléments ET les indices ^^. Pour rappel, la boucle for sans utiliser enumerate permet "seulement" d'avoir les valeurs ;).

          Pour ton code, on peut l'améliorer grandement en se rapprochant de la logique de la boucle for (ton raisonnement me semble extrêmement compliqué pour parcourir la liste smiley). On retire trouve (qui ne sert à rien) et on va simplement utiliser un compteur qu'on va incrémenter NORMALEMENT :lol::

          def recherche(lst, valeur):
              lst_ind = []
          
              i = 0
              taille = len(lst)
              while i < taille:
                  if lst[i] == valeur:
                      lst_ind.append(i)
                  i += 1
          
              return lst_ind


          REMARQUES:

          • J'ai retiré la demande à l'utilisateur de la fonction, et par contre j'ai rajouté un paramètre dans la fonction (comportement plus logique).
          • J'ai nommé mes variables plus explicitement
          • La taille de la liste est déterminer dynamiquement avec len. Car dans ton code, la taille doit obligatoirement être de 40 (ce qui est restrictif)

          Ce qu'a d'ailleurs également fait Derzal ;).

          Pour décrire le comportement de la fonction, au départ on a une liste vide nommé lst_ind. Si la valeur existe, on ajoute les indices. À la fin, on renvoie cette liste. Si il n'y avait aucune occurrence de la valeur recherchée, alors la liste est renvoyée vide. À partir de là, on peut faire le traitement d'affichage (qui se fait en dehors):

          ma_liste = [1, 2, 3, 4, 5, 5, 4, 2, 5, 1, 3, 2, 3, 2, 5, 3]
          valeur = float(input("Quelle valeur voulez-vous rechercher: "))
          
          #Récupération de la liste
          res = recherche(ma_liste, valeur)
          
          if res:  #Si la liste n'est pas vide
              print("La valeur {} est aux indices {}".format(valeur, res))
          else:  #Sinon
              print("La valeur {} n'a pas été trouvée dans la liste".format(valeur))


          Donc l'appel de la fonction se fait uniquement à la ligne 5. Tout le reste du traitement (affichage, demande à l'utilisateur) se fait à l'extérieur ;).

          PS: Ce qu'utilise Derzal (et moi aussi) ce n'est pas de la récursivité mais juste de l'itération :)

          • Partager sur Facebook
          • Partager sur Twitter
          Précepte: Le mieux est l'ennemi du bien
          Anonyme
            16 février 2016 à 13:18:04

            En récursif

            def recherche(myList, ind, value, r):
                try:
                    val = myList[ind]
                except IndexError:
                    return
                
                if val == value:
                    r.append(ind)
                
                recherche(myList, ind+1, value, r)
            
            liste = [100, 98, 94, 92, 91, 90, 88, 82, 81, 81, 81, 78, 75, 72, 65, 64, 63, 52, 50, 48, 35, 34, 32, 31, 28, 26, 25, 21, 20, 19, 16, 15, 15, 14, 13, 12, 10, 5, 4, 2, 0]
            r = []
            
            recherche(liste, 0, 81, r)
            print(r)



            -
            Edité par Anonyme 16 février 2016 à 13:19:10

            • Partager sur Facebook
            • Partager sur Twitter
              16 février 2016 à 14:41:10

              Pour pousser le truc jusqu'au bout pour le fun :

              fun = lambda value, iterable : (idx for idx, ele in enumerate(iterable) if value == ele)
              • Partager sur Facebook
              • Partager sur Twitter
                16 février 2016 à 17:52:41

                Finalement, on a le droit de faire un fichier séparément. :) Je ne comprends pas pourquoi on devait rester avec un codage pareil. :(

                Merci à tous! Je marque le sujet comme résolu.

                • Partager sur Facebook
                • Partager sur Twitter
                  16 février 2016 à 19:14:08

                  OK, non, ce n'est pas résolu du tout. J'ai fait mon code, mais le problème est qu'après l'utilisation de return, rien ne se produit...

                  De plus, lorsque je demande d'exécuter le programme, rien ne s'affiche arpès l'input.

                  #Déclaration de la liste.
                  liste = [100, 98, 94, 92, 91, 90, 88, 82, 81, 81, 81, 78, 75, 72, 65, 64, 63, 52, 50, 48, 35, 34, 32, 31, 28, 26, 25, 21, 20, 19, 16, 15, 15, 14, 13, 12, 10, 5, 4, 2, 0]
                  
                  #Il est nécéssaire d'assigner t à liste, soit d'écrire recherche(t=liste) dans le Shell.
                  def recherche(t):
                      #Déclaration de r.
                      r = float(input("Saisir la valeur de l'élément à rechercher:" ))
                      #Création d'une liste des indices correspondant à la valeur cherchée.
                      t_indices = []
                      #On établit la variable m (indice) se trouvant dans la liste des indices de t (créée avec range et len).
                      for m in range(len(t)):
                          #Si la valeur de m est celle de r, on ajoute m à la liste des indices t_indices établie plus tôt.
                          if t[m] == r:
                              t_indices.append(m)
                      #On programme la fonction par récursivité: l'algorithme se répète tout en ayant retenu l'indice trouvé grâce à return.
                      return t_indices
                      #On affiche le résultat.
                      print("La valeur recherchée a pour indice(s)", t_indices, ".")
                  #Programme principal.
                  recherche(t=liste)

                  Quelles sont mes erreurs SVP?

                  -
                  Edité par Sunnymoon 16 février 2016 à 19:47:13

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 février 2016 à 19:27:48

                    Allez, avoue. Tu n'as pas lu mon premier post, hein :lol::

                    • Olygrim a écrit:

                      On peut faire plus propre en utilisant la fonction enumerate [...] C'est LA manière propre quand on itère sur un objet dont on veut avoir ET les éléments ET les indices.

                    • Olygrim a écrit:

                      Tout le reste du traitement (affichage, demande à l'utilisateur) se fait à l'extérieur ;).





                    • Partager sur Facebook
                    • Partager sur Twitter
                    Précepte: Le mieux est l'ennemi du bien
                      16 février 2016 à 20:06:29

                      Oui, désolé, je ne comprenais pas le principe. Merci!

                      Dernière question: comment faire pour que l'Invite de commandes ne se ferme pas quand le programme y est executé? J'ai essayé de mettre raw_input(), mais il ne semble pas que ma version la reconnaisse...

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 février 2016 à 20:52:11

                        Il ne faut pas faire un double clic pour ouvrir le fichier. Je te remet la réponse de celthon d'un autre post:

                        celthon a écrit:

                        Le problème est toujours le même... Il n'y a aucun intérêt à mettre en pause un programme en console ! Et la pause n'aura jamais lieu si une erreur se trouve dans le programme avant l'instruction qui le met en pause.

                        Cette histoire de pause est l'une des nombreuses inepties de ce tutoriel. Quand on veut exécuter un programme en console, on le fait depuis une console ouverte manuellement, surtout quand le programme n'est pas encore débuggé.

                        Peu importe l'OS :

                        1. Ouvrir un terminal (nommée « Invite de commandes » sous Windows et souvent « Émulateur de terminal » sous Linux).
                        2. Ce déplacer vers le dossier du script avec la commande cd, exemple: cd C:\Users\username\MonDossier\ (voir help cd pour plus d’information)
                        3. Appeler Python en lui donnant le script (fichier) en argument : py -3 monscript.py sous Windows, ou python3 monscript.py sous Unixoïde.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Précepte: Le mieux est l'ennemi du bien
                          16 février 2016 à 23:03:19

                          Merci! Je peux verouiller...
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Afficher des indices multiples d'une liste

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown