Passer des arguments à key=itemgetter
Hello,
Je m'entraîne sur les dataclass/fonction et je bloque sur une bêtise...
L'une de mes fonctions doit afficher les membres d'un groupe.
J'aimerais avant de l'afficher, ordonner la liste de dictionnaire.
J'y arrive en hardcodant les arguments mais j'aimerais les passer en variable de ma fonction. J'ai essayé plusieurs choses mais j'ai à chaque fois une erreur en passant un tuple, une liste etc.
def show_members(self):
"""Affiche les membres de notre groupe"""
members_ordered = sorted(self.members, key=itemgetter('firstname', 'age'))
for member in members_ordered:
print(f"{member['firstname']} {member['age']} ans, {'actif' if member['active'] else 'inactif'}.")
return members_ordered
Ce que je voudrais c'est un truc du genre :
def show_members(self, order):
"""Affiche les membres de notre groupe"""
self.order: tuple = order
members_ordered = sorted(self.members, key=itemgetter(self.order))
for member in members_ordered:
print(f"{member['firstname']} {member['age']} ans, {'actif' if member['active'] else 'inactif'}.")
return members_ordered
show_members('age', 'firstname')
D'avance, merci pour votre aide.
Bonne soirée,
Benoit
Salut Benoit,
je ferais un truc comme ça.
from operator import itemgetter
class Members:
def __init__(self, members):
self.members = members
def sort_and_show_members(self, *args):
"""Affiche les membres de notre groupe"""
if args:
self.members.sort(key=itemgetter(*args))
for member in self.members:
print(f"{member['firstname']} {member['name']} {member['age']} ans, {'actif' if member['active'] else 'inactif'}.")
return None
if __name__ == "__main__":
input_members = [
{"firstname": "xavier", "age": 32, "name": "Smith", "active": True},
{"firstname": "etienne", "age": 25, "name": "Dupond", "active": True},
{"firstname": "marie", "age": 31, "name": "Smith", "active": True},
{"firstname": "helene", "age": 45, "name": "Mercier", "active": True},
]
members = Members(input_members)
le *args te permet de renseigner optionnellement les clés de tri. Il se peut que tu ne veuilles afficher tes membres sans les trier, dans ce cas tu ne renseignes aucune clé. En revanche tu peux en renseigner plusieurs:
In [2]: members.sort_and_show_members()
xavier Smith 32 ans, actif.
etienne Dupond 25 ans, actif.
marie Smith 31 ans, actif.
helene Mercier 45 ans, actif.
In [3]: members.sort_and_show_members("name", "age")
etienne Dupond 25 ans, actif.
helene Mercier 45 ans, actif.
marie Smith 31 ans, actif.
xavier Smith 32 ans, actif.
je te conseille cependant de séparer au max. C'est à dire une méthode qui affiche et une qui trie.
Si tu ne veux pas modifier ta list members et que tu ne veux qu'elle soit trié que pour l'affichage tu peux garder une copie de members et utiliser sorte au lieu de sort.
A ta dispo si ce n'est pas clair pour toi.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte