IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Trouver un nombre dans une liste


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2022
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Trouver un nombre dans une liste
    Hello,
    J'ai récemment commencer à apprendre Python et j'ai eu l'idée de créer un programme qui détecte le nombre supérieur le plus proche d'un nombre x.
    J'ai commencer par chercher sur google et j'ai trouvé ces lignes de code :

    def closest(lst, K):
    return lst[min(range(len(lst)), key=lambda i: abs(lst[i] - K))]

    Premièrement je ne comprend pas la ligne ce qui m'aide pas pour modifier les valeurs, donc si quelqu'un est chaud m'expliquer ce que fait cette ligne.
    Et deuxièmement je suis pas sur que c'est la meilleur façon de faire donc si quelqu'un à une autre idée pour trouver le nombre supérieur le plus proche d'un nombre x, n'hésite pas à me la donner !
    Sur ce, je vous souhaite une bonne journée/ fin de journée et vous remercie par avance !

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Viking24 Voir le message
    et j'ai eu l'idée de créer un programme qui détecte le nombre supérieur le plus proche d'un nombre x.
    Que signifie "détecter"? Par exemple le nombre supérieur (sous-entendu "entier") le plus proche de 18, c'est "18+1". Donc à la base, tu prends ton nombre et tu lui ajoutes 1 et c'est torché.

    Citation Envoyé par Viking24 Voir le message
    J'ai commencer par chercher sur google et j'ai trouvé ces lignes de code :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def closest(lst, K):
        return lst[min(range(len(lst)), key=lambda i: abs(lst[i] - K))]
    Ok, donc là on voit qu'il y a une notion de "liste" (ie "liste de nombres"). Hé oui, c'est bien de le préciser car même si pour toi ça va sans dire, pour les autres ça va quand-même mieux en le disant.

    Citation Envoyé par Viking24 Voir le message
    Premièrement je ne comprend pas la ligne ce qui m'aide pas pour modifier les valeurs, donc si quelqu'un est chaud m'expliquer ce que fait cette ligne.
    Python c'est comme pour tout, ça s'apprend.
    "lst" c'est une liste de nombres. Donc le premier nombre de cette liste sera lst[0], le second sera lst[1] et etc. Il faut juste trouver "x" tel que lst[x] soit le plus proche de K.
    Or une notion de "proximité" implique une notion de distance. Et c'est quoi une distance entre deux nombres A et B? C'est A-B ou B-A (selon qui est le plus grand), ou plus simplement abs(A-B).
    Et le "plus proche" implique la distance la plus petite, d'où le "min()" que l'on voit apparaitre donnant le minima entre plusieurs valeurs. Et ce "min" est paramétrable. En effet, le min de 2 et 3 c'est évidemment 2 mais le min de "abba" et "babar" ce serait quoi? Donc la fonction min() permet de définir comment évaluer un élément dont on veut ensuite le minimum de tous ; et de l'indiquer ensuite via le paramètre "key" dans lequel on lui place une fonction dite "fonction lambda" (fonction "oneline") qui pour chaque "i" reçu calcule la distance entre ls[i] et K.

    Donc cette ligne, qui fait appel à ce qu'on nomme les "listes en intension" et qui est déjà du Python un peu avancé (chapitre 18 de mon tutoriel Python) va sortir le "x" correspondant à la plus petite distance entre lst[x] et le nombre K. Et te retourne au final ce nombre lst[x].
    Et effectivement c'est la meilleure façon de faire. Ou en tout cas la plus élégante. Seul détail: elle te retourne le nombre le plus proche, pas forcément le plus proche supérieur.

    Si tu veux vraiment le supérieur, voici par quoi il faut remplacer la fonction
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def closestSup(lst, K):
    	return lst[min(range(len(lst)), key=lambda i: (lst[i] - K) if (lst[i] - K) > 0 else max(lst))]
    Donc là, ce "if" final sert à séparer les nombres dont la différence avec K sera positive (donc supérieurs à K) de ceux dont elle sera négative. Et pour ceux-là, je remplace cette distance par le nombre maximal de la liste (qui de fait ne pourra pas convenir et ne sera donc pas pris en compte dans le min des distances).

    Et s'il faut impérativement l'inférieur, je pense que tu pourras trouver tout seul comment réécrire la fonction...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2022
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ta réponse, grâce à toi j'ai bien compris la ligne :) !
    J'ai oublié de préciser dans mon premier message que je cherchais le nombre le plus proche parmi une liste de nombre.
    Le programme trouvé sur internet marche sans problème mais maintenant j'aimerais trouver le nombre dans cette même liste le plus proche et supérieur du nombre K.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Viking24 Voir le message
    mais maintenant j'aimerais trouver le nombre dans cette même liste le plus proche et supérieur du nombre K.
    En fin de mon précédent post.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2022
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Je te prie de m'excuser je n'avais pas vu cette partie du post !
    Bonne fin de journée à toi et merci bcp !

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Viking24 Voir le message
    Je te prie de m'excuser je n'avais pas vu cette partie du post !
    C'est pas grave mais... ça ne marche que si la liste contient un nombre supérieur à K.
    Sinon le min() n'aura aucune distance à évaluer (il n'aura que le nombre max à chaque fois) et te renvoie alors un nombre au hasard (enfin correspondant à ce que lui considère comme étant le min de n fois le même nombre).

    Si tu veux gérer tous les cas possibles, voici une solution
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def closestSup(lst, K):
    	# Gestion si lst ne contient aucun nombre n > K
    	if not any(n > K for n in lst):
    		return ... (là tu mets ce que tu veux retourner dans ce cas)
     
    	return lst[min(range(len(lst)), key=lambda i: (lst[i] - K) if (lst[i] - K) > 0 else max(lst))]
    # closestSup()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Homme Profil pro
    Apprenti dev Python
    Inscrit en
    Août 2021
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti dev Python

    Informations forums :
    Inscription : Août 2021
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Salut,
    je ne suis pas sûr de trouver la réponse à ton problème mais je tente quand même.

    tu peux utiliser la méthode .sort() sur une liste pour trier tes nombres dans l'ordre croissant

    ensuite tu utilise la méthode .index() qui renvoi l'index (c'est-à-dire la position) de l'élément que tu appelles
    et en fin tu ajoutes 1 à l'index pour trouver le nombre juste au-dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    liste = [4,81,0,3,10]
    liste.sort()#liste devient [0,3,4,10,81]
    index = liste.index(4)#renvoi 2 (=position de l'élément 4)
    nb_supérieur = index + 1
    print(liste[nb_superieur]) #retourne 10

  8. #8
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    Citation Envoyé par dymon2021 Voir le message
    Salut,
    je ne suis pas sûr de trouver la réponse à ton problème mais je tente quand même.

    tu peux utiliser la méthode .sort() sur une liste pour trier tes nombres dans l'ordre croissant

    ensuite tu utilise la méthode .index() qui renvoi l'index (c'est-à-dire la position) de l'élément que tu appelles
    et en fin tu ajoutes 1 à l'index pour trouver le nombre juste au-dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    liste = [4,81,0,3,10]
    liste.sort()#liste devient [0,3,4,10,81]
    index = liste.index(4)#renvoi 2 (=position de l'élément 4)
    nb_supérieur = index + 1
    print(liste[nb_superieur]) #retourne 10
    Ton code ne fonctionnera pas dans le cas suivant(doublon du 4):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    liste = [4,81,0,4,3,10]
    Tu peux transformer ta liste en set pour éliminer les doublons...
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  9. #9
    Membre du Club
    Homme Profil pro
    Apprenti dev Python
    Inscrit en
    Août 2021
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti dev Python

    Informations forums :
    Inscription : Août 2021
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Ton code ne fonctionnera pas dans le cas suivant(doublon du 4):
    Bien vu

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dymon2021 Voir le message
    tu peux utiliser la méthode .sort() sur une liste pour trier tes nombres dans l'ordre croissant
    C'est lourd de trier tout un ensemble pour n'en extraire qu'un seul élément. Mais si tu y tiens, je préconiserais alors sorted() qui génère une copie triée sans toucher à la liste d'origine (tu ne sais pas si elle ne sera pas utile plus tard).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre du Club
    Homme Profil pro
    Apprenti dev Python
    Inscrit en
    Août 2021
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti dev Python

    Informations forums :
    Inscription : Août 2021
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    je préconiserais alors sorted() qui génère une copie triée sans toucher à la liste d'origine
    Je ne connaissais pas cette méthode, elle est effectivement mieux

Discussions similaires

  1. [XL-2007] Trouver les nombres dans une plage leures sommes equale un nombre connue
    Par iliesss dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/09/2012, 00h26
  2. mettre chaque chiffre d'un nombre dans une liste
    Par rom117 dans le forum Prolog
    Réponses: 4
    Dernier message: 13/12/2010, 23h39
  3. [Débutant] Trouver un nombre dans une matrice
    Par djk35 dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/02/2009, 18h20
  4. Trouver un encadrement d'un nombre dans une liste
    Par boulette85 dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 15/07/2008, 13h33
  5. Trouver un nombre dans une chaine de caractère ?
    Par Coussati dans le forum Débuter
    Réponses: 4
    Dernier message: 27/10/2007, 00h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo