Je connais la fonction sorted, je connais aussi values, items et toutes les méthodes de dict.
J'ai trié les valeurs avec values, sauf que ça m'affiche que les valeurs et ça n'envoie pas les clés, je ne sais pas comment reconstruire le dictionnaire.
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
for key in sorted(d, key = d.get, reverse=True) :
print (key, d[key])
Pour comprendre comment ça marche, il faut déjà comprendre comment fonctionne sorted. Généralement lorsque l'on utilise cette fonction, on lui passe un itérable, et le travail attendu est fait. Il n'y a cependant rien de magique ici, lors d'un tri il y a forcément comparaison de valeurs et python utilise des fonctions bien spécifiques et propre à chaque types/objet. Prenons un exemple simple :
l = ["aa", "a", "b"]
sorted(l)
# ['a', 'aa', 'b']
Nous avons ici le comportement natif de la comparaison d'un string à un autre, si l'on fait :
'b' > 'aa' > 'a'
On aura comme résultat True. Maintenant imagine que tu souhaites trier ta liste uniquement par la longueur de la chaîne. Pour bypasser la comparaison directe des éléments de ton itérable, la fonction sorted te propose de passer par un argument spécifique appelé key. L'idée est que key doit être une fonction qui te retourne une valeur, et ce sera cette valeur qui sera utilisée pour comparer chaque élément. Le plus souvent (ou pas), on passe par une fonction anonyme mais tu peux utiliser n'importe quelle fonction :
Note ici que l'on n'utilise pas de parenthèses, en effet on envoie véritablement la fonction en argument, qui sera appelée par la suite par sorted.
Maintenant revenons à notre réponse du départ. Ici on utilise la fonction get, qui donne un résultat similaire au comportement natif lorsque l'on recherche une clé existante dans un dictionnaire :
Dans notre cas, du coup, on trie les clés en fonction de leur valeur, et par la suite on accède au résultat en itérant sur ces clés. Il faut savoir que la méthode get est utilisé ici, mais on pourrait passer par la méthode "standard" utilisé avec les [] qui n'est qu'une écriture permettant d'appeler la fonction __getitem__ :
for key in sorted(d, key=d.__getitem__) :
print (key, d[key])
Pour info :
D'un point de vue performance, cette méthode est bonne si ton dictionnaire n'est pas grand et si tu n'as pas besoin de réaliser beaucoup de fois cette manœuvre. Les dictionnaires sont implémentés en python grâce à une table de hachage permettant d'obtenir un accès extrêmement rapide à partir d'une clé en O(1). Cependant la structure des dictionnaires ne permet pas la tri des clé. A partie de la version 3.6 (et maintenant ça deviendra officiel pour la version 3.7), les dictionnaires deviennent nativement ordonnés (ce qui ne veut pas dire triés !) ce qui permet de réaliser cette opération de tri qu'une seule fois, à moins qu'on rajoute de nouvelles valeurs, auquel cas un nouveau tri sera nécessaire. Pour les précédentes versions, les OrderedDict peuvent être utilisés.
Je préfère une réponse en français, et il y a des choses que je ne maîtrise pas sur ce site
Je te cite toi même
BastienPortigo a écrit:
Je connais la fonction sorted, je connais aussi values, items et toutes les méthodes de dict.
Sur le site que j'ai indiqué, sorted (et l'argument key de la fonction sorted) c'est absolument tout ce qu'ils utilisent, et la solution tient en 3 lignes. Qu'est ce que tu ne maitrises pas sur le lien que je t'ai fourni ?
Je ne veux pas te casser les pieds, mais si l'anglais te rebute au point de ne pas chercher sur les sites anglais, tu ne risques pas d'aller bien loin en programmation. On est tous passés par là, et moi le premier (c'est rare de naître bilingue) ; à force de lire l'anglais tu vas voir que c'est pas si compliqué que ça, surtout l'anglais informatique. Une grosse partie de la programmation passe avant tout par savoir faire une recherche sur internet et collecter les infos afin de ne pas avoir à réinventer la roue à chaque fois
- Edité par potterman28wxcv 10 novembre 2017 à 16:31:36
print(x.items()) --> [(1, 2), (3, 4), (4, 3), (2, 1), (0, 0)] ; c'est à dire, une liste de tuples avec (clé, dict(clé))
operator.itemgetter(1) : la fonction qui à un tuple, associe le 2ème élément. C'est à dire (operator.itemgetter(1))(3, 4) == 4
ça va donc trier tes éléments selon les valeurs de (operator.itemgetter(1))(element) ; c'est à dire selon le deuxième élément. Ce qui est a priori ce que tu veux.
C'est certes en anglais, mais c'est expliqué tout aussi bien si tu fais une recherche "key sorted python" sur Google, et tombe sur ça :)
- Edité par potterman28wxcv 13 novembre 2017 à 11:52:43
print(x.items()) --> [(1, 2), (3, 4), (4, 3), (2, 1), (0, 0)] ; c'est à dire, une liste de tuples avec (clé, dict(clé))
operator.itemgetter(1) : la fonction qui à un tuple, associe le 2ème élément. C'est à dire (operator.itemgetter(1))(3, 4) == 4
ça va donc trier tes éléments selon les valeurs de (operator.itemgetter(1))(element) ; c'est à dire selon le deuxième élément. Ce qui est a priori ce que tu veux.
C'est certes en anglais, mais c'est expliqué tout aussi bien si tu fais une recherche "key sorted python" sur Google, et tombe sur ça :)
- Edité par potterman28wxcv il y a environ 21 heures
Ma question est de savoir si c'est possible de le faire sans, si ce n'est pas possible alors je serais donc obligé de l'utiliser
Il te suffit de comprendre à quoi sert l'argument key et tu pourras l'utiliser insouciamment. Jevanni donne une bonne explication ci-dessus, il y a quelque chose en particulier que tu n'aurais pas compris dans son poste ?
Il te suffit de comprendre à quoi sert l'argument key et tu pourras l'utiliser insouciamment. Jevanni donne une bonne explication ci-dessus, il y a quelque chose en particulier que tu n'aurais pas compris dans son poste ?
Dans sa méthode utilisé on peut pas bloquer le résultat dans une variable, et en plus j'ai pas tout compris, en réalité dans le tutoriel, on vient d'apprendre comment parcourir des dictionnaires avec des clé, avec des valeurs et avec les deux grâce à items, et il donne cet exercice, donc en toute logique pourquoi nous faire apprendre ça si c'est pas pour l’utiliser dans l'exercice, ça n'a absolument aucun sens, du coup je pense qu'il faut se débrouiller avec ça, même si j'ai essayé et que ça ne donne aucun résultat, je suis en train de me demander si c'est vraiment possible de faire son truc, car même avec key de la fonction sorted ça ne modifie pas la liste d'origine de toute façon
Tu peux effectivement te débrouiller sans keys, avec juste la méthode items et les opérations sur les listes vues précédemment.
En effet, sorted ne modifie pas l'objet passé en paramètre, ça tombe bien, ce n'est pas ce que tu souhaites.
Tu souhaites obtenir en sortie une liste triée de couples (fruit, quantité).
Tu peux effectivement te débrouiller sans keys, avec juste la méthode items et les opérations sur les listes vues précédemment.
En effet, sorted ne modifie pas l'objet passé en paramètre, ça tombe bien, ce n'est pas ce que tu souhaites. Tu souhaites obtenir en sortie une liste triée de couples (fruit, quantité).
Je suis à Parcours des clés et valeurs simultanément et il met l'exercice dans cette catégorie, sauf que j'ai l'impression que c'est littéralement impossible
Tu peux effectivement faire comme dans le chapitre précédent puisque la méthode items te permet de construire une liste de tuples (la même structure de données que celle que tu as vu précédemment).
Le problème c'est que vous avez vu l'exercice est fait, mais l'inventaire n'est plus un dictionnaire mais une liste avec des tuples, on peut pas trier un dictionnaire en le laissant dictionnaire sans utiliser key de sorted ?
Enfin bref au final j'ai converti inventaire à nouveau en dictionnaire
Le problème c'est que vous avez vu l'exercice est fait, mais l'inventaire n'est plus un dictionnaire mais une liste avec des tuples, on peut pas trier un dictionnaire en le laissant dictionnaire sans utiliser key de sorted ?
Enfin bref au final j'ai converti inventaire à nouveau en dictionnaire
Un dictionnaire en Python n'est pas fait pour être trié. Ce que t'appelles "dictionnaire trié", c'est juste que quand tu le print ça t'affiche les valeurs dans le bon ordre, mais sinon il n'y a absolument aucun ordre dans un dictionnaire.
Ou des dictionnaires ordonnés (collections.OrderedDict) pour qui l'ordre des données a de l'importance.
À noter aussi que depuis Python 3.6, l'ordre d'insertion des éléments dans les dictionnaires est conservé, sans que ça n'ait la moindre influence sur l'égalité entre dictionnaires.
Mon précédent post ne s'est pas affiché ou alors c'était absolument pas clair ?
- Edité par Jevanni il y a 39 minutes
Ah non non, il s'est bien affiché, et il était sûrement très clair, mais vois-tu, si une personne vient d'apprendre à compter et qu'on essaie de lui apprendre l'Algèbre ça ne fonctionnera pas, malgrè une bonne explication, il faut d'abord apprendre les additions, ensuite les soustractions et les multiplications, et ainsi de suite.
Là c'est un peu pareil, je préfère apprendre dans l'ordre et ne pas sauter les étapes, je ne maîtrise pas encore le key de la fonction sorted en réalité, et j'ai vu qu'on allait apprendre ça dans la suite du tutoriel, du coup ce n'était pas ce qui m'était demandé dans l'exercice, car je venais d'apprendre à utiliser items et autres, tout simplement.
Mon précédent post ne s'est pas affiché ou alors c'était absolument pas clair ?
- Edité par Jevanni il y a 39 minutes
Ah non non, il s'est bien affiché, et il était sûrement très clair, mais vois-tu, si une personne vient d'apprendre à compter et qu'on essaie de lui apprendre l'Algèbre ça ne fonctionnera pas, malgrè une bonne explication, il faut d'abord apprendre les additions, ensuite les soustractions et les multiplications, et ainsi de suite.
Là c'est un peu pareil, je préfère apprendre dans l'ordre et ne pas sauter les étapes, je ne maîtrise pas encore le key de la fonction sorted en réalité, et j'ai vu qu'on allait apprendre ça dans la suite du tutoriel, du coup ce n'était pas ce qui m'était demandé dans l'exercice, car je venais d'apprendre à utiliser items et autres, tout simplement.
C'est pas super sympa d'ignorer un post quand quelqu'un y a passé un certain temps pour te répondre, et que c'est bien expliqué. C'est encore moins sympa de prendre un ton condescendant pour expliquer pourquoi tu n'as pas lu le post.
On fait ça sur notre temps libre, la moindre des choses est que tu prêtes attention à ce qu'on écrit, surtout quand c'est des posts aussi bien expliqués que celui de Jevanni.
- Edité par potterman28wxcv 15 novembre 2017 à 16:40:56
Après il ne faut pas être trop frileux non-plus. La notion de fonction passé en argument d'une autre fonction pourrait même être vue dès l'instant où l'on apprend ce qu'est une fonction (d'ailleurs ça devrait être le cas pour tous les cours qui utilise Python).
Mais si c'est juste le comportement d'une fonction que tu ne comprends pas, il n'y a pas d'ordre à respecter. Et dans le cas de la fonction sorted, l'explication de Jevanni est très bien.
Mon précédent post ne s'est pas affiché ou alors c'était absolument pas clair ?
- Edité par Jevanni il y a 39 minutes
Ah non non, il s'est bien affiché, et il était sûrement très clair, mais vois-tu, si une personne vient d'apprendre à compter et qu'on essaie de lui apprendre l'Algèbre ça ne fonctionnera pas, malgrè une bonne explication, il faut d'abord apprendre les additions, ensuite les soustractions et les multiplications, et ainsi de suite.
Là c'est un peu pareil, je préfère apprendre dans l'ordre et ne pas sauter les étapes, je ne maîtrise pas encore le key de la fonction sorted en réalité, et j'ai vu qu'on allait apprendre ça dans la suite du tutoriel, du coup ce n'était pas ce qui m'était demandé dans l'exercice, car je venais d'apprendre à utiliser items et autres, tout simplement.
C'est pas super sympa d'ignorer un post quand quelqu'un y a passé un certain temps pour te répondre, et que c'est bien expliqué. C'est encore moins sympa de prendre un ton condescendant pour expliquer pourquoi tu n'as pas lu le post.
On fait ça sur notre temps libre, la moindre des choses est que tu prêtes attention à ce qu'on écrit, surtout quand c'est des posts aussi bien expliqués que celui de Jevanni.
- Edité par potterman28wxcv il y a 6 minutes
J'ai lu intégralement son post, d'ailleurs si tu prends le temps de lire les messages précédents tu verras que j'ai testé la méthode de Jevanni, mais que je ne mets pas en pratique les leçons du cours, ce qui n'a pas beaucoup de sens, je remercie cette personne d'avoir pris le temps de m'aider.
Je n'ai pas assez de recul pour te dire si je suis condescendant ou pas, mais si c'est bien le cas, je m'en excuse d'avance, ce n'est pas mon but de cracher dans la main des personnes qui veulent me venir en aide.
Trier un dictionnaire par valeur
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique