Filter les valeurs d'un input()

maxime_boris Messages postés 39 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je souhaite remplir la liste
Cotes
puis filtrer cette liste avec la fonction ci_dessous.

Merci

def ifilter(predicate, iterable):
    if predicate is None:
        predicate = bool
    for x in iterable:
        if predicate(x):
            yield x

cotes = input("Veuillez saisir les cote: ").split()

Cotes = []
for x in cotes:
    try:
        float(x)
    except ValueError:
        Cotes.append(x)
print(Cotes)

d = ifilter(lambda x: x < 20, Cotes)
print(d)

4 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    le code ne fonctionne pas?
    0
  2. maxime_boris Messages postés 39 Statut Membre
     
    bonjour oui le code ne fonctionne pas je ne sais pas d'ou ça provient. As tu une idée
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      "le code ne fonctionne pas": que rentres-tu? que reçois-tu?
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        est-ce ton premier exercice avec try/except?
        essaie peut-être avec un exercice plus simple.
        0
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    Que voit-on si l'on fait

    print(cotes)

    juste après

    cotes = input(.....
    0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Comme Phil le souligne, mettre des
    print
    t'aiderait sans doute à mieux comprendre ce qui ne va pas. En l'occurrence :
    • Ta variable
      cotes
      contient une liste de chaînes de caractère (e.g.
      ['5', '20', '10', '30', '40']
      si on saisit
      5 20 10 30 40
      .
    • Ta boucle
      for
      itère sur ces valeurs, calcule la conversion flottante (qui dans mon exemple marche pour chaque élément) mais n'en fait rien. J'imagine que tu souhaites dans ces conditions les ajouter à la fin de
      Cotes
      ? Étonnamment, si la valeur n'est pas transformables en
      float
      , alors tu vas l'ajouter à la fin de
      Cotes
      . Donc si par exemple tu saisis
      abc def
      ,
      Cotes
      sera égal à
      ["abc", "def"]
      . Il va sans dire que l'appel au prédicat par défaut (
      bool()
      ) n'a aucune chance de marcher, puisque ces valeurs ne correspondent en rien à des booléens.
    • Et ceci m'amène au point suivant : le prédicat par défaut me semble bancale. En gros il vérifie si la valeur passée en paramètre se transforme naturellement en
      bool
      . Alors certes, appeler
      bool()
      ne plantera pas car tu reçois des valeurs numériques, mais cette fonction renverra
      False
      si
      0
      figure parmi tes côtes. Un prédicat plus naturel serait celui qui renvoie systématiquement
      True
      (et donc, qui fait que
      ifilter
      ne filtre rien), ce que tu peux écrire avec une
      lambda
      .


    predicate = (lambda x: True)


    Pour information, la fonction
    filter
    de python fait plus ou moins ce que tu tentes de coder dans
    ifilter
    , j'imagine que c'est le but de l'exercice ?

    Bonne chance
    0