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 :

Création d'un dictionnaire à partir d'une liste


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Création d'un dictionnaire à partir d'une liste
    Bonjour,
    J'ai un exercice à faire en cours et j'avoue que je bloque, je ne trouve pas de solution propre et facile,
    Je vous énonce le problème :

    J'ai une liste du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListNotes = [['Mathématiques', '12'], ['Mathématiques', '9'], ['Mathématiques', '15'], ['Informatique', '17'], ['Physique', '11'], ['Physique', '8'], ['Chimie', '16'], ['Chimie', '10']]
    à partir de cette liste je souhaiterais créer un dictionnaire avec, clé : nom de la matière valeur : moyenne des notes dans cette matière.

    Je débute en python et je ne trouve pas de méthode qui pourraient marcher, à noter qu'il faudrait que le programme fonctionne avec toutes sortes de listes (des matières / des notes différentes)

    Merci pour votre aide

    Thomas

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Citation Envoyé par TH0MA5 Voir le message
    Je débute en python et je ne trouve pas de méthode qui pourraient marcher, à noter qu'il faudrait que le programme fonctionne avec toutes sortes de listes (des matières / des notes différentes)
    Il faudrait commencer par revoir comment fonctionne un dictionnaire. Dans le Swinnen, c'est ici. Après vous essayez de comprendre quoi coder et si vous n'arrivez pas à faire fonctionner votre code, vous aurez de quoi poster.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par TH0MA5 Voir le message
    J'ai un exercice à faire en cours et j'avoue que je bloque, je ne trouve pas de solution propre et facile,
    Ben donne ta solution même si elle est peu propre et peu facile et là on t'aidera à l'éméliorer.

    Citation Envoyé par TH0MA5 Voir le message
    à partir de cette liste je souhaiterais créer un dictionnaire avec, clé : nom de la matière valeur : moyenne des notes dans cette matière. Je débute en python et je ne trouve pas de méthode qui pourraient marcher
    Boucle sur la liste. Si la matière n'est pas dans le dico alors ajout de la matière comme clef avec somme des notes et nombre de notes comme valeurs (donc une liste de deux éléments) tout à 0. Puis sommation de la note en cours (item[0] de la liste) et incrément du nombre de notes (item[1] de la liste).
    Puis en fin de boucle reprise de chaque clef et remplacement de chaque liste par la division de la somme des notes par le nombre de notes. Assez propre et pas super difficile.
    Exemple minimaliste avec un 18 et un 15 en maths:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    moyenne=dict()
    moyenne=["mathématiques"]=[0, 0]
    moyenne["mathématiques"][0]+=18
    moyenne["mathématiques"][1]+=1
    moyenne["mathématiques"][0]+=15
    moyenne["mathématiques"][1]+=1
    moyenne["mathématiques"]=moyenne["mathématiques"][0]/moyenne["mathématiques"][1]
    print(moyenne)
    Il n'y a plus qu'à automatiser ça dans une jolie boucle.

    Ensuite il y a plus propre si on commence par créer immédiatement le dictionnaire vierge avec les matières comme clef ce qui évite un test dans la boucle mais cela fait appel une liste en compréhension auquel on peut rajouter éventuellement un set(), notions peut-être pas encore vues.
    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 éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Bonjour,

    La difficulté de l'exercice provient du type de données à traiter. Il faut déjà supprimer tous les doublons de matières et y rassembler l'ensemble des notes, quelque chose comme,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [['Mathématiques', ['12', '9', '15']], ['Informatique', ['17']], ['Physique', ['11', '8']], ['Chimie', ['16', '10']]]
    et après avec une simple boucle, récupérer chaque matière, et en calculer la moyenne pour chacune,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'Mathématiques': 12.0, 'Informatique': 17.0, 'Physique': 9.5, 'Chimie': 13.0}
    Attention les notes sont en chaîne de caractères, il faudra traiter cela pour que se soit des flottants.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Citation Envoyé par fred1599 Voir le message
    La difficulté de l'exercice provient du type de données à traiter.
    Tout à fait.

    On peut aussi remarquer que la liste est bien rangée (tous les mathématiques, puis tous les Informatique,...) mais que le PO ne dit pas si c'est le hasard ou l'intention du professeur de faire faire une boucle avec machine d'état pour remplir directement le dictionnaire directement avec matière/moyenne.

    Comme on ne sait pas trop ce qui a été vu en cours (et encore moins les intentions du prof.) on n'a aucune idée du Python à utiliser pour écrire la solution. Et on ne peut qu'aider à comprendre pourquoi un code ne fonctionne pas (pour autant qu'on montre quelque chose) et dans un 2ème temps montrer comment faire çà avec un Python plus avancé (si nécessaire/utile/agréable).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut !

    Une solution toute faite, libre à toi de la copier !

    Et si tu veux comprendre plutôt que de recopier sans rien y comprendre, je te mets des liens avec quelques lignes à lire seulement :
    Sorted = lien
    Unzip = lien
    Enumerate = lien
    Compréhension de liste = lien

    C'est bien, ce que j'ai fait, les pros ? Montrez-moi vos skills ! La dernière partie doit être one-lineable mais je suis un peu trop limité cérébralement pour ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    >>> ListNotes = [['Mathématiques', '12'], ['Mathématiques', '9'], ['Mathématiques', '15'], ['Informatique', '17'], ['Physique', '11'], ['Physique', '8'], ['Chimie', '16'], ['Chimie', '10']]
    >>> c = list(zip(*sorted(ListNotes))) #[('Chimie', 'Chimie', 'Informatique', 'Mathématiques', 'Mathématiques', 'Mathématiques', 'Physique', 'Physique'), ('10', '16', '17', '12', '15', '9', '11', '8')]
    >>> new_liste=[[None,None]]
    >>> def mean(liste):
    	z = 0
    	for x in liste:
    		z+=float(x)
    	return z/len(liste)
     
    >>> for i,x in enumerate(c[0]):
    	if x not in [y for y,z in new_liste]:
    		new_liste.append([x,mean(c[1][i:i+c[0].count(x)])])
     
     
    >>> dict(new_liste[1:])
    {'Mathématiques': 12.0, 'Informatique': 17.0, 'Physique': 9.5, 'Chimie': 13.0}

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Citation Envoyé par LeNarvalo Voir le message
    Une solution toute faite, libre à toi de la copier !
    Déjà, soit le PO a trouvé une solution tout seul, soit il est allé chercher ailleurs car il ne s'est pas manifesté depuis son premier post. Après dans les règles de ces forums, on ne travaille pas pour les autres, on essaie de les aider à progresser...

    Citation Envoyé par LeNarvalo Voir le message
    C'est bien, ce que j'ai fait, les pros ? Montrez-moi vos skills !
    Si vous voulez qu'on passe du temps à vous expliquer comment améliorer votre code, ouvrez une discussion spécifique plutôt que cannibaliser celle d'un autre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par LeNarvalo Voir le message
    (...)
    dans le cas présent y'a un truc qui peut pas mal faciliter le boulot c'est le defaultdict du module collections :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> d = collections.defaultdict(list)
    >>> for i in ListNotes:
    ...     d[i[0]].append(float(i[1]))
    ...
    >>> for i in d:
    ...     d[i] = sum(d[i])/len(d[i])
    ...
    >>> dict(d)
    {'Mathématiques': 12.0, 'Informatique': 17.0, 'Physique': 9.5, 'Chimie': 13.0}
    pour ce qui est de la onetroislinerisation () on peut envisager un truc comme ça tout cracra :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    d = collections.defaultdict(list)
    [d[i[0]].append(float(i[1])) for i in ListNotes]
    {i:sum(d[i])/len(d[i]) for i in d}
    (ce doit être faisable en une unique ligne mais j'ai pas plus cherché)

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    C'est bien, ce que j'ai fait, les pros ?
    Pourquoi tu tries la liste initiale? D'une part ce n'est pas demandé dans le cahier des charges et d'autre part ton résultat final n'est quand-même pas trié...

    Citation Envoyé par LeNarvalo Voir le message
    La dernière partie doit être one-lineable...
    La première aussi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ListNotes = [['Mathématiques', '12'], ['Mathématiques', '9'], ['Mathématiques', '15'], ['Informatique', '17'], ['Physique', '11'], ['Physique', '8'], ['Chimie', '16'], ['Chimie', '10']]
     
    print(dict((x, sum(float(y[1]) for y in ListNotes if y[0] == x)/tuple(x[0] for x in ListNotes).count(x)) for x in set(x[0] for x in ListNotes)))

    Citation Envoyé par BufferBob Voir le message
    (ce doit être faisable en une unique ligne mais j'ai pas plus cherché)
    J'en ai effectivement un peu chié...
    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]

  10. #10
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    (...)
    Pour la fonction mean, on peut faire plus simple et efficace avec la fonction sum et map, du genre sum(map(float, args)) / len(args)Pour l'itération avec enumerate, c'est plus compliqué à expliquer, mais je verrai bien un flag avec la possibilité de breaker la boucle lorsque l'élément existe déjà dans la liste.
    Ça permet des itérations sur moins d'éléments. Par contre rien en vue pour du oneline propre et même ce que je vois ne me satisfait pas sur le critère de la lisibilité.

    La solution que je trouve est plus longue mais plus naïve et n'est pas ce que tu attends selon moi.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  11. #11
    Invité
    Invité(e)
    Par défaut
    @BufferBob
    dans le cas présent y'a un truc qui peut pas mal faciliter le boulot c'est le defaultdict du module collections :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> d = collections.defaultdict(list)
    >>> for i in ListNotes:
    ...     d[i[0]].append(float(i[1]))
    ...
    >>> for i in d:
    ...     d[i] = sum(d[i])/len(d[i])
    ...
    >>> dict(d)
    {'Mathématiques': 12.0, 'Informatique': 17.0, 'Physique': 9.5, 'Chimie': 13.0}
    Ah ouai, franchement joli ! C'est facile à lire en plus. Faut que je me note ça quelque part !

    Citation Envoyé par Sve@r Voir le message
    Pourquoi tu tries la liste initiale? D'une part ce n'est pas demandé dans le cahier des charges et d'autre part ton résultat final n'est quand-même pas trié...
    C'est parce que mon script nécessite que la liste regroupe les éléments ! L'ordre n'a pas d'importance. C'est du bidouillage !

    Sinon, c'est un truc de fou ton oneline je ne pensais pas que c'était possible aussi "courtement" sinon tu as utilisé set plutôt que list pour tirer par note ?


    @wiztricks
    Allez avoue, t'as pas réussi à faire mieux ! T'es jaloux !
    Et pi chui pas cannibale mais végétarien d'abord !
    Sinon je trouve ça contre productif de demander aux habitués du forum de partager leurs solutions sur un autre topic que celui qui en parle initialement, mais si tu veux...
    Et pi² j'ai quand même donné des liens en plus de mon code, c'est plutôt pédagogique, nan ?

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    sinon tu as utilisé set plutôt que list pour tirer par note ?
    set() pour avoir le nom des matières une fois seulement

    Citation Envoyé par LeNarvalo Voir le message
    C'est bien, ce que j'ai fait, les pros ?
    Tu as quand-même fait beaucoup d'opérations un peu inutiles. Tu es même allé jusqu'à définir une fonction pour calculer la moyenne alors que ce calcul n'est à faire qu'une fois (ok une fois par matière mais une boucle suffit quoi). Et pourquoi mettre [None, None] dans new_liste ce qui t'oblige alors à demander new_liste[1:] pour ne pas avoir ce [None, None] qui de toute façon ne sert à rien???
    J'avais expliqué un algo pourtant assez simple : boucle sur la liste. Si la matière n'est pas dans le dico alors ajout de la matière comme clef avec somme des notes et nombre de notes comme valeurs (donc une liste de deux éléments) tout à 0. Puis sommation de la note en cours (item[0] de la liste) et incrément du nombre de notes (item[1] de la liste).
    Puis en fin de boucle reprise de chaque clef et remplacement de chaque liste par la division de la somme des notes par le nombre de notes (là donc calcul de la moyenne sans besoin de fonction)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    res=dict()
     
    # Sommation des notes de chaque matière
    for (matiere, note) in ListNotes:
    	if matiere not in res: res[matiere]=[0, 0]
    	res[matiere][0]+=float(note)
    	res[matiere][1]+=1
    # for
    print(res)							# Pour voir ce que ça donne à ce niveau
     
    # Calcul de la moyenne
    for (k, v) in res.items():
    	res[k]=v[0]/v[1]
    print(res)

    Et comme je l'avais dit, on peut éviter le test de la matière qui est/n'est pas dans le dictionnaire si on commence par créer le dictionnaire avec les matières déjà inscrites: res=dict((x, [0, 0]) for x in set(note[0] for note in ListNotes)). Puis évidemment certains outils additionnels comme le defaultdict peuvent aussi simplifier certaines étapes.

    Ensuite on peut partir dans des délires...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Calcul de la moyenne
    import operator
    for (k, v) in res.items():
    	res[k]=operator.truediv(*v)

    Citation Envoyé par LeNarvalo Voir le message
    @wiztricks
    Allez avoue, t'as pas réussi à faire mieux ! T'es jaloux !
    Tu devrais pas trop le titiller car il va te sortir un truc à coup de numpy ou de collections qui ira 10 fois plus vite, sera 10 fois plus court et va tous nous foutre la honte...
    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]

  13. #13
    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
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Déjà, soit le PO a trouvé une solution tout seul, soit il est allé chercher ailleurs car il ne s'est pas manifesté depuis son premier post. Après dans les règles de ces forums, on ne travaille pas pour les autres, on essaie de les aider à progresser...



    Si vous voulez qu'on passe du temps à vous expliquer comment améliorer votre code, ouvrez une discussion spécifique plutôt que cannibaliser celle d'un autre.

    - W
    Bonjour,
    Perso, je trouve instructif et profitable à tous d'échanger les différentes façons d'aborder un sujet et de les illustrer avec un code. Cela engendre une dynamique positive et constructive.
    D'ailleurs, il n'y a pas que le PO qui lit les réponses. Nombreux ceux, qui comme moi, lisent un post afin de s'enrichir des éventuelles réponses des participants...
    Et puis j'estime qu'une langue s'apprend en la parlant. Parfois, un code vaut mieux qu'un long discours .
    Ce n'est pas du cannibalisme: c'est du grain pour le moulin
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  14. #14
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Bonjour,
    Perso, je trouve instructif et profitable à tous d'échanger les différentes façons d'aborder un sujet et de les illustrer avec un code. Cela engendre une dynamique positive et constructive.
    D'ailleurs, il n'y a pas que le PO qui lit les réponses. Nombreux ceux, qui comme moi, lisent un post afin de s'enrichir des éventuelles réponses des participants...
    Et puis j'estime qu'une langue s'apprend en la parlant. Parfois, un code vaut mieux qu'un long discours .
    Ce n'est pas du cannibalisme: c'est du grain pour le moulin
    Il n'y a pas que le PO qui lit, mais par définition on répond déjà à un problème pour le PO et effectivement pour d'autres en priorité 2.
    Seulement est-ce que l'objectif pédagogique est atteint en répondant un code tout cuit dans le bec ? Je répondrai que parfois oui, parfois non... selon le PO, il peut l'utiliser pour faire ses propres recherches, poser des questions pour affiner ses connaissances, etc ou se contenter de ce qu'il a, récupérer de bons résultats alors que d'autres ont des notes selon le travail produit, et donc une forme d'injustice à mon sens, sans compter le fait qu'il ne retiendra probablement rien de sa réponse.

    Quand tu lis une langue, tu vas rechercher mot par mot dans un dictionnaire ce que tu ne comprends pas, il y a une recherche... Dans un code python, tu cliques sur le bouton exécuter, et le code fonctionne comme par magie, sans avoir besoin de recherches.

    Du grain au moulin pour d'autres, mais pour le PO ?

    Sinon moi aussi j'aime bien m'amuser à chercher des codes sympas pour les présenter ici, et je suis sûr que de nouveaux arrivants se sont déjà servi de codes réponses, pour résoudre leurs problèmes, mais c'est vrai que quand on arrive à guider le PO vers une réponse perso et que ça fonctionne, c'est une fierté et surtout un code qui lui permet de s'expliquer sur le comment. On essaye d'y ajouter des informations que d'autres membres n'ont pas dîtes pour aide supplémentaire afin de l'aider à avoir le déclic et écrire ses premières lignes.

    Bref je suis ni pour ni contre, il faut un juste milieu, et je pense que ce milieu démarre à partir du moment où une communication avec le PO commence. Ce qui n'est apparemment pas le cas actuellement.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    D'ailleurs, il n'y a pas que le PO qui lit les réponses. Nombreux ceux, qui comme moi, lisent un post afin de s'enrichir des éventuelles réponses des participants...
    collections.defaultdict ou dict.setdefault pour améliorer ce qu'on peut faire avec un dict basique sont souvent rappelées dès qu'un débutant nous fait partager ses difficultés à jouer avec un dictionnaire.

    Je veux bien entendre que la répétition est une des bases de l'assimilation mais notre extension de cerveau qui s'appelle Internet et ses moteurs de recherche font qu'on n'a plus trop besoin de retenir les détails (on les peut retrouver facilement) mais se concentrer sur la démarche.

    Citation Envoyé par LeNarvalo Voir le message
    @wiztricks
    Allez avoue, t'as pas réussi à faire mieux ! T'es jaloux !
    Et pi chui pas cannibale mais végétarien d'abord !
    Sinon je trouve ça contre productif de demander aux habitués du forum de partager leurs solutions sur un autre topic que celui qui en parle initialement, mais si tu veux...
    Jaloux de quoi? Cherchez un peu dans les réponses que j'ai faites dans ces forums depuis que j'y traine. J'ai certainement du écrire le même code plein de fois déjà.
    Et vous auriez trouvé ces solutions (écrites par des tas de gens) en cherchant un peu sur Internet.
    Proposer un code à corriger ou essayer de voir ce qu'on a déjà raconté pour résoudre ce genre de problème?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    set() pour avoir le nom des matières une fois seulement


    Tu as quand-même fait beaucoup d'opérations un peu inutiles. Tu es même allé jusqu'à définir une fonction pour calculer la moyenne alors que ce calcul n'est à faire qu'une fois (ok une fois par matière mais une boucle suffit quoi). Et pourquoi mettre [None, None] dans new_liste ce qui t'oblige alors à demander new_liste[1:] pour ne pas avoir ce [None, None] qui de toute façon ne sert à rien???
    Oui j'ai fais un peu compliqué...
    Je voulais essayer de travailler à partir d'un objet déjà en parti réorganiser et je me suis compliqué la vie ensuite... D'un côté un tuple de matière et de l'autre un tuple avec les notes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ('math', 'math', 'math', 'histoire',...)
    ('15','12','13','16',...)
    Donc ma fonction récupère la liste des éléments de '15' à '13' pour les maths, etc grâce à enumerate !

    J'ai fais mieux grâce à vous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    res=dict()
     
    ListNotes = [['Mathématiques', '12'], ['Mathématiques', '9'], ['Mathématiques', '15'], ['Informatique', '17'], ['Physique', '11'], ['Physique', '8'], ['Chimie', '16'], ['Chimie', '10']]
     
    for (matiere, note) in ListNotes:
            try:
                    res[matiere].append(float(note))
            except:
                    res[matiere]=[float(note)]
     
    print(dict([[i[0],sum(i[1])/len(i[1])] for i in res.items()]))

    Citation Envoyé par Sve@r Voir le message
    Tu devrais pas trop le titiller car il va te sortir un truc à coup de numpy ou de collections qui ira 10 fois plus vite, sera 10 fois plus court et va tous nous foutre la honte...
    🤫
    Mince je l'ai fâché !
    Dernière modification par Invité ; 16/05/2021 à 11h12.

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    J'ai fais mieux grâce à vous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    res=dict()
     
    ListNotes = [['Mathématiques', '12'], ['Mathématiques', '9'], ['Mathématiques', '15'], ['Informatique', '17'], ['Physique', '11'], ['Physique', '8'], ['Chimie', '16'], ['Chimie', '10']]
     
    for (matiere, note) in ListNotes:
            try:
                    res[matiere].append(float(note))
            except:
                    res[matiere]=[float(note)]
     
    print(dict([[i[0],sum(i[1])/len(i[1])] for i in res.items()]))
    Mieux mais avec encore quelques défauts. Déjà on évite les except de tout et n'importe quoi car si justement n'importe quoi d'autre arrive tu n'en es pas informé. L'exception pour un défaut de clef dans un dictionnaire c'est KeyError.
    Et il existe dict.setdefault() qui permet de se passer de ce test...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (matiere, note) in ListNotes:
    	res.setdefault(matiere, []).append(float(note))
    Remarque j'aurais pu l'utiliser aussi pour mon propre code.

    Et pour le calcul final, déjà la liste interne est inutile quand un tuple suffit et je préfère (goût personnel) unpacker les items() d'un dictionnaire dans un tuple (k, v) pour "key", "valeur". Je me dis que je gagne au-moins un traitement d'index peut-être plus long => print(dict(((k, sum(v)/len(v)) for (k, v) in res.items()))).
    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]

  18. #18
    Invité
    Invité(e)
    Par défaut
    try et except c'est mon pêché mignon ! ^^

    Ok pour dict.setdefault() je ne connaissais pas avant que wiz en parle et je ne voyais pas trop comment l'utiliser.

    Sans ta remarque je n'aurais jamais pensé que le tuple était plus performant que la liste... Je n'arrive jamais à l'étape d'optimisation de mes scripts, en tout cas pas à ce point.

    Issu de stackoverflow :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    >>> def a():
    ...     x=[1,2,3,4,5]
    ...     y=x[2]
    ...
    >>> def b():
    ...     x=(1,2,3,4,5)
    ...     y=x[2]
    ...
    >>> import dis
    >>> dis.dis(a)
      2           0 LOAD_CONST               1 (1)
                  3 LOAD_CONST               2 (2)
                  6 LOAD_CONST               3 (3)
                  9 LOAD_CONST               4 (4)
                 12 LOAD_CONST               5 (5)
                 15 BUILD_LIST               5
                 18 STORE_FAST               0 (x)
     
      3          21 LOAD_FAST                0 (x)
                 24 LOAD_CONST               2 (2)
                 27 BINARY_SUBSCR
                 28 STORE_FAST               1 (y)
                 31 LOAD_CONST               0 (None)
                 34 RETURN_VALUE
    >>> dis.dis(b)
      2           0 LOAD_CONST               6 ((1, 2, 3, 4, 5))
                  3 STORE_FAST               0 (x)
     
      3           6 LOAD_FAST                0 (x)
                  9 LOAD_CONST               2 (2)
                 12 BINARY_SUBSCR
                 13 STORE_FAST               1 (y)
                 16 LOAD_CONST               0 (None)
                 19 RETURN_VALUE

Discussions similaires

  1. [Python 3.X] Création d'une matrice ou d'un dictionnaire à partir d'une liste 2D
    Par dannyd3006 dans le forum Général Python
    Réponses: 3
    Dernier message: 24/10/2020, 12h38
  2. [XL-2007] Création de nouveau doc à partir d'une liste
    Par problemeaide dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/12/2012, 10h08
  3. Créer un dictionnaire à partir d'une liste
    Par jouclar dans le forum Général Python
    Réponses: 7
    Dernier message: 25/04/2012, 22h09
  4. Création d'un calendrier à partir d'une liste
    Par lesanglier dans le forum SharePoint
    Réponses: 3
    Dernier message: 22/10/2009, 11h03
  5. Création d'un arbre à partir d'une liste contigue
    Par karaz_karaz dans le forum C
    Réponses: 2
    Dernier message: 28/06/2008, 23h51

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