Résolue

Passer des arguments à key=itemgetter

# Dictionnaires # Fonctions

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.

Salut Pierre-André,


C'est exactement ce que je voulais en mieux, merci pour les conseils supplémentaires. :D

Ca permettra au code d'être plus permissif, c'est top.


Benoit

avec plaisir . Bonne continuation. Merci pour ton retour .

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.