Filter les valeurs d'un input()

maxime_boris Messages postés 35 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33769 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

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
le code ne fonctionne pas?
0
maxime_boris Messages postés 35 Date d'inscription   Statut Membre Dernière intervention  
 
bonjour oui le code ne fonctionne pas je ne sais pas d'ou ça provient. As tu une idée
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
"le code ne fonctionne pas": que rentres-tu? que reçois-tu?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > yg_be Messages postés 23541 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
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour,

Que voit-on si l'on fait

print(cotes)

juste après

cotes = input(.....
0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
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