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 :

Problème de tri sur un dictionnaire PYTHON


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 130
    Par défaut Problème de tri sur un dictionnaire PYTHON
    Bonjour

    Comment trier un dictionnaire PYTHON sur lui-même ou éventuellement sur un autre dictionnaire ?

    En effet

    Dans la séquence suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sorted(selection.keys())
       for cle, valeur in selection.items():
    			print({cle}, " ", {valeur})
    L'édition révèle un fichier dictionnaire non trié

    Alors que dans celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for k in sorted(selection.keys()):
     	  print("%s: %s" % (k, selection[k]))
    L'édition est triée

    En vous remerciant

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Quand tu écris sorted(selection.keys()), tu ne fais que trier un truc temporaire, truc contenant toutes les clefs mais disparaissant quand l'instruction se termine. A la limite tu écrirais print(sorted(selection.keys())) tu verrais tes clefs triées s'afficher mais ça ne change rien au fait que ce que tu verrais ne serait que le résultat du truc temporaire créé et disparu juste après. Le dictionnaire, lui, est resté inchangé. Il s'ensuit que le for cle, valeur in selection.items() te redonne les items du dictionnaire tels qu'ils sont stockés c'est à dire dans un ordre interne probablement lié aux id des clefs mais ne correspondant à rien d'humainement identifiable.

    Déjà la notion de "tri de dictionnaire" n'a en elle-même pas vraiment de sens vu qu'un dictionnaire n'est pas trié (enfin comme je l'ai dit il l'est probablement en fonction d'un critère lié à Python mais non lié à l'humain). Si maintenant tu veux accéder aux éléments dans un ordre de ton choix, alors c'est à toi de créer l'outil qui va te générer cet ordre et tu appliqueras cet outil quand tu récupèreras tes éléments.

    Petit exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> auteurs={1:"Hugo", 3:"Racine", 5:"Balzac")
    >>> for (k, v) in sorted(auteurs.items(), key=lambda x: x[1][2]): print(k,v)		# Tri sur le 3° caractère de chaque valeur (g, c, l)
    ...
    3 Racine
    1 Hugo
    5 Balzac
    Mais c'est pareil, le dictionnaire "auteurs" est resté inchangé. Ce qui n'est finalement pas vraiment grave puisque cette façon de faire te permet quand-même de traiter les éléments du dictionnaire dans l'ordre de ton choix à chaque fois que tu en auras envie.

    Toutefois si tu as besoin pour diverses raisons d'un dictionnaire toujours trié sur un critère précis, tu peux alors te tourner vers le OrderedDict du module collections (from collections import OrderedDict). Je m'en sers par exemple quand je veux afficher des données issus d'une bdd dans un ordre très particulier. Je crée alors un OrderedDict correspondant à l'ordre dans lequel je veux afficher les données puis je remplis l'OrderedDict avec les données de la bdd. Ensuite je n'ai plus qu'à afficher l'OrderedDict dans l'ordre dans lequel il a été créé.
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 130
    Par défaut
    Tous remerciements pour ta réponse. Avant de poser ma question j'ai erré, navigué sur différents sites et, ne trouvant pas de solutions j'ai fait appel au forum. Tes explications vont me faire gagner pas mal de temps. Encore merci

  4. #4
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    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 : 923
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour


    Toutefois si tu as besoin pour diverses raisons d'un dictionnaire toujours trié sur un critère précis, tu peux alors te tourner vers le OrderedDict du module collections (from collections import OrderedDict). Je m'en sers par exemple quand je veux afficher des données issus d'une bdd dans un ordre très particulier. Je crée alors un OrderedDict correspondant à l'ordre dans lequel je veux afficher les données puis je remplis l'OrderedDict avec les données de la bdd. Ensuite je n'ai plus qu'à afficher l'OrderedDict dans l'ordre dans lequel il a été créé.
    Bonjour,

    Depuis la version de python 3.7, les dictionnaires sont ordonnés par défaut...

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Depuis la version de python 3.7, les dictionnaires sont ordonnés par défaut...
    Oui il me semblait avoir vu ça quelque part mais je ne savais pas trop (pas du tout en fait ) de quelle version il s'agissait.
    Ok, je viens de faire quelques essais avec un python 3.7.3 et effectivement "il semblerait" que le dictionnaire soit trié selon l'ordre d'écriture. J'espère que t'as raison parce que désormais je vais partir sur ce principe
    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]

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par tom31 Voir le message
    Comment trier un dictionnaire PYTHON sur lui-même ou éventuellement sur un autre dictionnaire ?
    en complément de ce qu'ont déjà dit Sve@r et Hominidé, il suffit donc de réaffecter la variable selection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    selection={5:"Hugo", 1:"Racine", 3:"Balzac"}
    selection=dict(sorted(selection.items()))                      # tri par clé   : {1: 'Racine', 3: 'Balzac', 5: 'Hugo'}
    selection=dict(sorted(selection.items(), key=lambda x:x[1]))   # tri par valeur: {3: 'Balzac', 5: 'Hugo', 1: 'Racine'}

Discussions similaires

  1. Problème de tri sur une PRIMARY KEY
    Par dudu92 dans le forum Oracle
    Réponses: 9
    Dernier message: 19/06/2007, 12h12
  2. [C#] Problème de tri sur datagrid
    Par arnauann dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/04/2007, 02h24
  3. Réponses: 3
    Dernier message: 21/09/2006, 15h55
  4. Problème de tri sur les dates par année puis mois
    Par rob2-9 dans le forum Access
    Réponses: 26
    Dernier message: 11/08/2006, 11h04
  5. [VB.NET] Problème de tri sur Datagrid/gridview multilingue
    Par crimsonPhantom dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/03/2006, 22h41

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