Trier par ordre aphabétique une liste de dictionnaires

Résolu/Fermé
xunil2003 Messages postés 761 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 24 mars 2024 - Modifié le 6 mars 2023 à 23:23
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 6 mars 2023 à 23:46

Bonjour,

J'ai une liste de dictionnaires avec des noms et prénoms, je voudrais savoir comment je peux trier ma liste de dictionnaire par ordre alphabétique.

Agendas = {['nom': 'Macron', 'prenom': 'stephane', 'adresse': 'champs de mars','ville': 'Paris'],  ['nom': 'mathieu', 'prenom': 'claude', 'adresse': 'place de la mairie','ville': 'Marseille'] , ['nom': 'dubosc', 'prenom': 'jen-pierre', 'adresse': 'xxxxx','ville': 'Paris']} 

comment je dois faire pour trier les contacts par ordre alphabétique ?

Merci d'avance pour vos avis et conseils.
Linux / Firefox 110.0

A voir également:

2 réponses

Bonsoir,

.

Sans doute avec OrderedDict.

https://docs.python.org/3/library/collections.html#collections.OrderedDict

0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
6 mars 2023 à 23:46

Malheureusement OrderedDict ne répond pas à la question ici, puisque la structure qui stocke les contacts n'est pas un dictionnaire. OrderedDict serait bien adapté si la clé était par exemple un couple (nom, prenom) auquel on associe les métadonnées (adresse, ville). Et dans ce cas, on ne pourrait pas gérer les homonymes, puisque par définition d'un dictionnaire, une clé apparaît au plus une fois dans un dictionnaire.

0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 6 mars 2023 à 23:44

Bonjour xunil2003,

Préliminaires

Ce que tu as codé dans ton message est syntaxiquement incorrect (ensemble de liste mal formées + pas toutes séparées par des virgules) :

Agendas = {
  ['nom': 'Macron', 'prenom': 'stephane', 'adresse': 'champs de mars', 'ville': 'Paris'],
  ['nom': 'mathieu', 'prenom': 'claude', 'adresse': 'place de la mairie', 'ville': 'Marseille']
  ['nom': 'dubosc', 'prenom': 'jean-pierre', 'adresse': 'xxxxx', 'ville': 'Paris']
}

De plus on évite de nommer une variable avec une majuscule (c'est réservé aux classes). Ce pauvre Jean-Pierre a également eu son prénom écorché et les majuscules manquent.

Note que le fait que les noms/prénoms commencent par une minuscule/majuscule a un impact (les caractères majuscules précèdent les caractères minuscules en python). C'est pourquoi il est sans doute une bonne idée de s'assurer avant de faire le tri que les valeurs associées au prénom et au nom sont bien composés de mots commençant par des majuscules :

agenda = [
    {
        k : v if k not in {"nom", "prenom"} else v.title()
        for (k, v) in contact.items()
    }
    for contact in agenda
]

Bref, après correction, je pense que tu as voulu écrire ceci :

agenda = [
  {
    'nom': 'Macron',
    'prenom': 'Stéphane',
    'adresse': 'Champs de mars',
    'ville': 'Paris'
  }, {
    'nom': 'Mathieu',
    'prenom': 'Claude',
    'adresse': 'Place de la mairie',
    'ville': 'Marseille'
  }, {
    'nom': 'Dubosc',
    'prenom': 'Jean-pierre',
    'adresse': 'xxxxx',
    'ville': 'Paris'
  },
]

Réponse à ta question sous ces hypothèses

Comme agenda est de type liste, tu peux tirer la liste avec la fonction sorted, qui prend en paramètre une callback d'associer à chaque élément de la liste une valeur (appelée clé) puis de trier la liste selon l'ordre (croissant) <. On peut aussi trier selon l'ordre décroissant en passant le paramètre reverse=True.

Dans ton cas tu veux tirer selon l'ordre alphabétique (je suppose, le nom de famille) donc ça donnerait :

from pprint import pprint

agenda = [
  {
    'nom': 'Macron',
    'prenom': 'Stéphane',
    'adresse': 'Champs de mars',
    'ville': 'Paris'
  }, {
    'nom': 'Mathieu',
    'prenom': 'Claude',
    'adresse': 'Place de la mairie',
    'ville': 'Marseille'
  }, {
    'nom': 'Dubosc',
    'prenom': 'Jean-pierre',
    'adresse': 'xxxxx',
    'ville': 'Paris'
  },
]

agenda = sorted(agenda, key=lambda d: (d["nom"], d["prenom"]))

pprint(agenda)

Résultat : on voit dans l'exemple ci-dessous que les contacts sont triés par nom croissant, puis par prénom croissant (selon l'ordre lexicographique).

[{'adresse': 'xxxxx',
  'nom': 'Dubosc',
  'prenom': 'Jean-pierre',
  'ville': 'Paris'},
 {'adresse': 'Champs de mars',
  'nom': 'Macron',
  'prenom': 'Stéphane',
  'ville': 'Paris'},
 {'adresse': 'Place de la mairie',
  'nom': 'Mathieu',
  'prenom': 'Claude',
  'ville': 'Marseille'}]

Bonne chance

0