Partage
  • Partager sur Facebook
  • Partager sur Twitter

passer d'une suite de nombre entier en liste

Sujet résolu
    22 décembre 2014 à 11:12:55

    Bonjour,

    Je me tourne vers vous car je suis dans une impasse ...

    Je dois réaliser une fonction qui demande à l'utilisateur d'entrée une suite de nombre (exemple : 1234) et ensuite la convertir en liste ( [1, 2, 3, 4]
    Et qui dois ensuite vérifier que les nombres de la liste sont supérieur à 1 inférieur ou égale à une variable et qu'il sont bien de type int.
    Voilà ce que j'ai fais : 

    def choixCouleurJoueur(nbrCouleur, longueurSuite):
        a = 1
        while a == 1:
            couleurChoisit = input("Entrez les nombres : ")
            listecouleurchoisit = list(couleurChoisit)
            print(listecouleurchoisit)
            for i in range(listecouleurchoisit):
                if i < 1 or i > nbrCouleur or type(listecouleurchoisit) != int:
                    a = 1
                else:
                    return listecouleurchoisit
                    a = 0



    Mais cela me retourne l'erreur : TypeError: 'list' object cannot be interpreted as an integer

    Si vous pouviez m'aider se serai génial !

    -
    Edité par pseudomac 22 décembre 2014 à 11:14:00

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      22 décembre 2014 à 11:34:03

      Essaie ça: int_to_list = lambda n: [int(x) for x in str(n)]. Tu parcours simplement n en tant que chaîne de caractère pour isoler les chiffres x puis tu les reconvertis chacun en nombre entier avec int :)

      • Partager sur Facebook
      • Partager sur Twitter
        22 décembre 2014 à 11:51:16

        Bonjour AlphaZeta !

        Tout d'abord merci pour ta réponse :)

        Voici ce que j'ai essayé Je ne suis pas sur d'avoir correctement utilisé ce que tu m'as passé ...

        def choixCouleurJoueur(nbrCouleur, longueurSuite):
            a = 1
            while a == 1:
                couleurChoisit = input("Entrez les nombres : ")
                int_to_list = lambda couleurChoisit: [int(x) for x in str(couleurChoisit)]
                print(int_to_list)
        Cela me retourne : <function choixCouleurJoueur.<locals>.<lambda> at 0xb71eb4ac>
        • Partager sur Facebook
        • Partager sur Twitter
          22 décembre 2014 à 12:05:12

          int_to_list est une fonction qui te renvoie une liste.

          tu n'as pas a ecrire print (int_to_list)

          voila pourquoi tu obtiens cet affichage.

          pour que ca fonctionne tu dois lui passer un parametre.

          PS : AlphaZeta, super le oneliner

          • Partager sur Facebook
          • Partager sur Twitter
          Ils ne savaient pas que c'était impossible, alors ils l'ont fait. ~ Mark Twain ~
            22 décembre 2014 à 12:08:51

            C'est normal, il faut que tu exécute la fonction (avec des parenthèses à la fin).

            int_to_list = (lambda couleurChoisit: [int(x) for x in str(couleurChoisit)])()

            Mais on peut faire plus élégant :) :

            list(map(int, list(str(1234))))




            • Partager sur Facebook
            • Partager sur Twitter
              22 décembre 2014 à 12:11:47

              et voila que ca degenere avec les oneliners ;

              PS : derzal, super le tien aussi ! :D

              • Partager sur Facebook
              • Partager sur Twitter
              Ils ne savaient pas que c'était impossible, alors ils l'ont fait. ~ Mark Twain ~
              Anonyme
                22 décembre 2014 à 12:17:13

                Bonjour,

                Déjà il faut savoir qu'une chaîne de caractères est un itérable, il est donc inutile de le transformer en liste.

                Ensuite, pour vérifier qu'un caractère est un entier on utilise régulièrement la méthode isdigit.

                Je ne vois pas non plus l'intérêt des paramètres de ta fonction...

                Pour moi la fonction ressemblerait à cela

                def choixCouleurJoueur(nbrCouleur, longueurSuite):
                    continuer = True # Trouver des noms de variable voulant dire quelquechose
                    while continuer:
                        couleurChoisit = input("Entrez les nombres : ")
                        for n in couleurChoisit:
                            if not n.isdigit() or int(n) <= 1:
                                continuer = False # pour sortir de la boucle infinie
                                break # Pour quitter la boucle for
                            # suite du traitement
                
                choixCouleurJoueur(..., ...) # Voir l'intérêt des paramètres de cette fonction

                EDIT: Les oneLiners avec des débutants, c'est juste un peu limite, mettez vous à sa place.



                -
                Edité par Anonyme 22 décembre 2014 à 12:19:20

                • Partager sur Facebook
                • Partager sur Twitter
                  22 décembre 2014 à 12:30:58

                  Merci à tous pour vos réponses !


                  Voici ce que ça donne :

                  def choixCouleurJoueur(nbrCouleur, longueurSuite):
                      a = 1
                      while a == 1:
                          couleurChoisit = input("Entrez les nombres : ")
                          listeCouleurChoisit = list(map(int, list(str(couleurChoisit))))
                          print(listeCouleurChoisit)
                          for i in range(listeCouleurChoisit):
                              if i < 1 or i > nbrCouleur or type(listeCouleurChoisit) != int:
                                  a = 1
                              else:
                                  return listeCouleurChoisit
                                  a = 0


                   J'ai préféré prendre la solution de derzal car cela ressemble plus au forme que j'ai pu voir en cours.

                  Le code fonctionne très bien jusqu'a l'affichage de listeCouleurChoisit.
                  En revanche il ne veux pas entrée dans le for, car :

                  for i in range(listeCouleurChoisit):
                  TypeError: 'list' object cannot be interpreted as an integer 



                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 décembre 2014 à 12:35:25

                    oldProgrammer : Effectivement tu as raison le paramètre "longueurSuite" ne me sert à rien ici.

                    Si j'ai besoin dans faire une liste, car ensuite le vais la comparer à d'autres ... 

                    Je ne connaissais pas la méthode isdigit

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 décembre 2014 à 12:38:22

                      remplace par : for i in listeCouleurChoisit

                      les listes sont iterables,

                      et de toute facon  range attend un int et non une liste

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Ils ne savaient pas que c'était impossible, alors ils l'ont fait. ~ Mark Twain ~
                      Anonyme
                        22 décembre 2014 à 15:00:35

                        Merci à tous pour vos réponses !

                        En même temps je n'ai pas l'impression que tu les écoute ou comprennent (si c'est le cas, faut le dire!)

                        Si j'ai besoin dans faire une liste, car ensuite le vais la comparer à d'autres ...

                        Une chaîne de caractères comme je l'ai dis précédemment, est un itérable et on peut donc comme une liste comparer deux chaînes de caractères. Voir transformer en liste, en chaîne, ...

                        J'ai préféré prendre la solution de derzal car cela ressemble plus au forme que j'ai pu voir en cours.

                        Je ne sais pas si c'est sa solution, mais ça m'étonne de lui dans ce cas, car la ligne map(int, list(str(couleurChoisit))) arrêtera automatiquement le programme avant même de faire le test sur le type de l'objet python, la ligne 8 ne servira donc strictement à rien dans le cas où il n'y a pas d'entiers, du moins cette partie : type(listeCouleurChoisit) != int...

                        Le plus simple serait de spécifier exactement l'intérêt de cette fonction et ce qu'elle prend en paramètres, avoir un exemple de ce que tu attends de cette fonction.

                        J'ai préféré prendre la solution de derzal car cela ressemble plus au forme que j'ai pu voir en cours.

                        J'ai gardé le meilleur pour la fin... Si tu commençais par nous dire ce que tu avais vu en cours, on adapterait et on perdrait moins de temps.

                        -
                        Edité par Anonyme 22 décembre 2014 à 15:02:31

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 décembre 2014 à 15:46:14

                          Oui c'est bien ma solution mais pas au problème donné (enfin juste la première partie), à la base je répondais juste à l'OP qui ne réussissait pas à utiliser la solution d'AZ, puis je me suis pris au jeu et j'ai fait un autre one-liner ;)

                          Par contre, puisqu'on demande une suite d'entier il ne sert a priori à rien de faire des tests (ou alors juste un au début du genre if chaine.isdigit()). Néanmoins je te rejoins sur le fait que ça aiderait de savoir ce que veux exactement l'OP.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 décembre 2014 à 9:04:12

                            oldProgrammer : 

                            Si si j'ai écouté et compris vos réponses.
                            Pour ce qui est de la liste je suis entrain de faire un projet distribué en cours, est il était clairement demander d'en faire une liste...

                            L'intérêt de cette fonction est de faire taper à l'utilisateur une suite que l'on comparera ensuite à une autre liste généré "aléatoirement" par l'ordinateur ... Tout cela afin de réaliser un Mastermind dans un premier temps en mode console et ensuite avec une interface graphique.

                            J'ai effectivement modifié le code car type(listeCouleurChoisit) != int dans ce cas ne sert plus à rien.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              23 décembre 2014 à 10:11:19

                              Ok donc je le redis les listes sont pas obligatoires pour preuve

                              >>> nombres_1 = '1234'
                              >>> nombres_2 = '3241'
                              >>> for ind, n in enumerate(nombres_1):
                              ...     print(n==nombres_2[ind])
                              ... 
                              False
                              True
                              False
                              False
                              >>> nombres_2[0] in nombres_1
                              True
                              

                              Maintenant si ton enseignant te demande une liste alors fait le ! Après tout la note dépendra de lui et du respect de ses consignes...

                              Le mastermind est courant comme projet ISN, je conseillerais de regarder des jeux mastermind en ligne, de voir les fonctionnalités différentes et de t'en inspirer (je ne parle pas de la règle du jeu).

                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 décembre 2014 à 10:57:42

                                Pour le coup, ce n'est pas enumerate qui est adapté mais plutôt zip:

                                code = '1234'
                                entree = '2451'
                                
                                for elt1, elt2 in zip(code, entree):
                                    print(elt1 == elt2)

                                Ensuite je te conseillerais plutôt de ne pas regarder sur internet, mais de d'abord essayer de faire par toi-même (avec ton groupe bien-sûr), ou de voir avec tes profs éventuellement (c'est discutable). Tu en retireras beaucoup plus d'expérience et surtout de satisfaction personnelle que si tu avais copié un code trouvé quelque part (je ne pense pas que tu fasses ça, mais une fois un code regardé tu auras beaucoup de mal à t'en détacher et ne pas faire comme ça ;) ). Et puis entre nous, un mastermind,c'est pas bien compliqué (15-20 lignes si on veut bien faire, en one-liner pour rigoler^^ (attention, je ne parle ici que de la structure principale, pas d'affichage des joueurs en fonction de leur score ou d'autres choses du même genre)).

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  23 décembre 2014 à 11:17:01

                                  Pour le coup, ce n'est pas enumerate qui est adapté mais plutôt zip:

                                  En fait plutôt les deux, sachant qu'un mastermind, il faut connaître l'index où se trouve les mêmes nombres, donc le mixe donnerait

                                  numbers_1 = '1234'
                                  numbers_2 = '3241'
                                  
                                  for ind, (val_1, val_2) in enumerate(zip(numbers_1, numbers_2)):
                                      if val_1 == val_2:
                                          print(ind)

                                  et dans ce cas à la rigueur, enumerate suffit

                                  numbers_1 = '1234'
                                  numbers_2 = '3241'
                                  
                                  for ind, val in enumerate(numbers_1):
                                      if val == numbers_2[ind]:
                                          print(ind)

                                  Enfin c'est des détails


                                  -
                                  Edité par Anonyme 23 décembre 2014 à 11:18:44

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 décembre 2014 à 11:36:18

                                    Oui c'est vrai, je partais dans l'optique d'un mastermind simplifié (celui qu'on nous a proposé en mini projet d'ISN), où il n'y a pas à gérer les cas où il y a les bons nombres mais à une mauvaise place.

                                    PS: n'empêche la première solution est la plus élégante :p. Et, à l'extrême rigueur (mais là on s'approche de la sodomie de diptères), si l'entrée de l'utilisateur (numbers_2) est plus courte que le code à trouver (numbers_1), le second code plantera alors que le premier non (pauvres mouches quand même...)

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      23 décembre 2014 à 11:41:00

                                      si l'entrée de l'utilisateur (numbers_2) est plus courte que le code à trouver (numbers_1), le second code plantera alors que le premier non

                                      Non impossible, il y aura contrôle avant :)

                                      Qui puis est sur une interface graphique ça ne peut arriver si l'interface est un minimum bien conçu, c'est pourquoi les entrées utilisateurs ne devraient (je pense) ne pas être prises en compte (en console) et imaginer que le monde actuel et le monde des bisounours sont assez proches pour que l'interface graphique soit facilement réalisable.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 décembre 2014 à 11:59:15

                                        Oui bien sur et c'est ce que je fais en général, j'essaie juste de trouver des imperfections pour l'amour de la discussion^^
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        passer d'une suite de nombre entier en 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