Tri d'une liste de dictionnaire selon salaire(python)

Bonjour a tous,
Je recherche une solution a mon probleme mais sans succès. A partir de ma liste:

l = [{'n':'dupont','p':'stephane','s':2500},
     {'n':'dubois','p':'nicolas','s':7000},
     {'n':'ducon','p':'phillipe','s':1250},
     {'n':'ducon','p':'alice','s':4530},
     {'n':'dupont','p':'jackie','s':2200},
     {'n':'lapin','p':'jeannot'},
     {'n':'dubois','p':'fanny','s':5000},
     {'n':'dupont','p':'steven','s':1670},
     {'n':'durant', 'p':'fabienne', 's':550},
     {'n':'durant', 'p':'eric', 's':1300}]

Je souhaiterai créer une fonction qui prend pour argument la liste et qui retourne:
–> le nom de la famille qui gagne le plus.
–> le nom de la famille qui gagne le moins.
Merci de votre aide .

Bonjour,

Je ne donne pas la solution toute faite, mais juste une indication : la méthode sort() d’une liste accepte comme argument key une fonction que l’on peut appeler, et qui permettrait d’extraire la clé s comme paramètre de comparaison.

Bon courage

Arnaud

Oui mais il faut faire la somme par famille d’abord, il me semble.

Merci de votre aide a tous les deux . Je vais bien y arriver a un moment donné .

Commence par créer une liste du genre [[7600,« dupont »],[3200,« dubois »],…} où 7600 et 3200 sont les revenus totaux de la famille.
Ensuite, un petit sort et c’est réglé.

Ha oui bien vu, j’avais raté ça.
Comme tu dis, il suffit de parcourir une fois la liste pour créer une liste ou un dictionnaire temporaire.

Il vaut mieux créer un dictionnaire avec le nom de famille en clé et le salaire en valeur.
Ensuite tu le transvases dans une liste que tu tries, celle que je t’ai proposée.

le script
#!/usr/bin/python3

l=[{'n':'dupont','p':'stephane','s':2500},
     {'n':'dubois','p':'nicolas','s':7000},
     {'n':'ducon','p':'phillipe','s':1250},
     {'n':'ducon','p':'alice','s':4530},
     {'n':'dupont','p':'jackie','s':2200},
     {'n':'lapin','p':'jeannot'},
     {'n':'dubois','p':'fanny','s':5000},
     {'n':'dupont','p':'steven','s':1670},
     {'n':'durant', 'p':'fabienne', 's':550},
     {'n':'durant', 'p':'eric', 's':1300}]

def richard(l):
  m=dict()
  for d in l:
    if "s" in d:
      if d["n"] in m:
        m[d["n"]]+=d["s"]
      else:
        m[d["n"]]=d["s"]
  s=sorted([[c,v] for v,c in m.items()])
  return s[-1][1],s[0][1] # on demande la plus riche et la moins riche
  
print(richard(l))

1 J'aime

Bonjour

Au cas où vous voudriez partager vos propositions de solutions,
vous pouvez aussi voir ce qui a été proposé dans ce fil de discussion

Bonjour à tous,
Perso, j’ai traité le problème ainsi:

def family(l):
    sort_family_name = sorted(l, key= lambda d: d['n'])
    revenu = 0
    family_name = sort_family_name[0]['n']
    l_out =[]
    for d in sort_family_name:
        if "s" in d:
            if d['n'] == family_name:
                revenu += d['s']
            else:
                l_out.append((family_name, revenu))
                revenu = 0
                family_name = d['n']
    l_out.append((family_name, revenu))
    return (max(l_out, key= lambda t: t[1]), min(l_out, key= lambda t: t[1]))

laplusriche, lapluspauvre = family(l)
print(f"La famille {laplusriche} est celle qui gagne le plus.\
la famille {lapluspauvre} est celle qui gagne le moins.")

édit: désolé c’est mon premier message ici et je n’arrive pas à utiliser la balise code.

Bonjour _fabien

Bienvenue sur debian-fr.org :slight_smile:

J’ai formaté le bloc de lignes de codes dans ton message.


En cliquant sur l’icône représentant un crayon
(en bas de ton précédent message et à droite)
tu pourras voir ton message dans une fenêtre d’édition,
ce qui te permettra aussi de voir :

  • la ligne que j’ai ajoutée juste avant le bloc de lignes de code,
  • et celle que j’ai ajoutée juste après le bloc de lignes de code.

Le bouton </> (Texte Préformaté…) n’est pas très évident à utiliser,
et il n’utilise pas la même syntaxe pour formater un bloc de lignes de code :

De plus, il faut prévoir d’insérer une ligne vide avant le bloc de lignes de code collé,
et une fois tout le bloc de ligne de code a été sélectionné
on peut cliquer sur le « bouton » </> ou utiliser le raccourci clavier Ctrl+Maj+C

Finalement, dans la fenêtre d’édition,
une suite de quatre caractères espace sera insérée
au début de chacune des lignes du bloc de lignes de code.

1 J'aime

Merci MicP :slightly_smiling_face:

@Nicola: Bien vu pour l’utilisation du dico .