Trier par ordre aphabétique une liste de dictionnaires
Résolu/Fermémamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 6 mars 2023 à 23:46
- Le fichier contient une liste de prénoms. triez ce tableau par ordre alphabétique des prénoms. quel mot est formé par les 6 premières lettres de la colonne code ?
- Trier avec Excel : toutes les méthodes de tri de données - Guide
- Code ascii tableau - Guide
- Liste déroulante excel - Guide
- Tableau croisé dynamique - Guide
- Fichier rar - Guide
2 réponses
Bonsoir,
.
Sans doute avec OrderedDict.
https://docs.python.org/3/library/collections.html#collections.OrderedDict
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
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.