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 :

Débutant : deux solutions pour un exercice élémentaire


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Débutant : deux solutions pour un exercice élémentaire
    La seconde peut-elle se défendre ?

    "Écrivez une fonction en Python qui permette de calculer l’argmax d’une liste, c’est-à-dire l’indice auquel est stockée la
    valeur maximale de la liste. Si cette valeur maximale est présente plusieurs fois dans la liste, on retournera l’indice de sa
    première occurrence."

    1 - Solution du tuto :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    def argmax(liste):
        i_max = None
    # On initialise elem_max à une valeur
    # qui n'est clairement pas le max
        if len(liste) > 0:
            elem_max = liste[0] - 1
        for i, elem in enumerate(liste):
            if elem > elem_max:
            i_max = i
            elem_max = elem
    return i_max
    print(argmax([45,2,89,14,2,3,7,8,56,89]))
    2
    2 - Autre solution (en prenant des libertés avec l'énoncé, mais qui affiche l'indice et le max.) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    liste = [45,2,89,14,2,3,7,8,56,89]
    print(liste.index(max(liste)),"-", max(liste))
    2 - 89

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 756
    Par défaut
    Salut,

    Citation Envoyé par vincent.steiner Voir le message
    La seconde peut-elle se défendre ?
    A partir du moment où le code sort le bon résultat, ça se défend.

    N'oubliez pas que l'exercice sorti d'un tuto. est supposé aider à s'exercer sur les notions présentés dans le ou les chapitres qui vont avec... histoire d'arriver à les maîtriser.

    Si la solution propose de s'exercer avec boucles et conditions plutôt que de les déléguer à des fonctions (qui bouclent pour nous), ce n'est pas pour rien...

    J'entends que le débutant puisse trouver assez frustrant d'écrire ses "boucles et conditions à la main" alors qu'il existe des solutions plus "courtes", "élégantes"...
    Si elles existent, c'est parce que les programmeurs ont "capturé" dans ces codes des opérations qu'ils devaient trop souvent coder par eux-même.

    C'est en sorte le résultat d'une intelligence collective... que l'on va redécouvrir assez facilement. Lorsqu'on se retrouvera à répéter des blocks d'instructions, on viendra naturellement (avec le temps) à se poser la question de savoir s'il n'y a pas une fonction qui...
    ou les découvrir en lisant la documentation une nième fois en se disant "tiens pour tel projet j'aurais gagné du temps en utilisant cette fonction".

    note: suite de nombres <=> numpy qui a argmax "builtin" et sans doute plus efficace.


    Cela dit, print(liste.index(max(liste)),"-", max(liste)) est une horreur: max doit balayer toute la liste pour trouver le max le faire 2 fois et demi n'est pas "optimal".
    Si on veut faire "avancé", on peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> L = [45,2,89,14,2,3,7,8,56,89]
    >>> max(enumerate(L), key=lambda x: x[1])
    (2, 89)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par vincent.steiner Voir le message
    2 - Autre solution (en prenant des libertés avec l'énoncé, mais qui affiche l'indice et le max.)
    Elle prend des libertés parce qu'elle affiche le max, ce qui n'est pas demandé par l'énoncé (qui demande juste l'indice).
    Donc si tu désires respecter strictement l'énoncé, suffit de n'afficher que l'indice => L.index(max(L)).
    Et si (comme le demande l'énoncé) tu veux une fonction... def argmax(L): return L.index(max(L)).
    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]

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    Bonjour,

    Pour le tuto, il est préférable à mon sens de traiter le cas où la liste est vide au départ de la fonction, initialiser la valeur max du premier élément de la liste et de ne prendre en considération que les valeurs suivantes (à partir du 2ème élément de la liste).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def argmax(liste):
        if not liste:
            return None
     
        elem_max = liste[0]
        for i, elem in enumerate(liste[1:]):
            # suite

Discussions similaires

  1. Débutante JAVA, aide pour un exercice.
    Par L.una dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 22/11/2018, 10h58
  2. je cherche une solution pour cet exercice
    Par rafikadouni dans le forum Débuter
    Réponses: 4
    Dernier message: 22/11/2007, 22h26
  3. Quelle solution pour un transfert sécurisé entre deux machines
    Par choubiroute dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 21/04/2006, 11h20

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